Your SlideShare is downloading. ×
Php
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Php

632
views

Published on

php

php

Published in: Technology

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
632
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
2
Comments
0
Likes
0
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide
  • [email_address]
  • [email_address]
  • AddHandler staturl .php .html .xyz [email_address]
  • Transcript

    • 1.  
    • 2.
      • 调优业务逻辑 ( 简化 / 拆分业务逻辑 )
      • 缓存访问量大的数据 ( 文件 / 内存 / Memcache )
      • 优化 / 压缩输出内容 ( css / j s / html / ob_start ())
      • 优化数据结构 ( database )
      • 缓存加速 PHP 代码 ( APC / Zend Optimizer /
      • XCache )
    • 3. 合理使用静态方法 提高执行效率 50%
    • 4. 脚本载入即增加常量到全局常量表中 ( 易混淆 ) 类被实例化后保存在类内部常量表中
    • 5. 尽量少用 @ 操作符
    • 6. 代码简短并不一定高效
    • 7.
      • 对纯文本文件或不需要 PHP 进行解析文件的读取并输出
        • file_get_contents / file
        • fread / fgets
        • require / include / require_once / include_once
        • readfile
        • fpassthru
        • 应用范围:
        • 文件下载 / 包含静态(缓存)文件 / 读取配置文件 等
        • 优化方法:
        • 理解每个函数的运行过程,有针对性的使用相关函数
    • 8.
      • readfile 和 fpassthru 直接调用 php_stream_passthru 将文件读到内存中
      • fgets / file / file_get_contents 调用 php_stream_open_wrapper_* 封装函数
      • include / require 调用 zend_stream_open ()
      常用读取文件函数的执行效率 Function Time(s) Memory(b) 32K 1M 32K 1M file_get_contents 0.00152 0.00564 52480 1067856 fgets 0.00195 0.07190 30760 30768 file 0.00157 0.06464 87344 2185624 require_once 0.00225 0.08065 67992 2067696 include 0.00222 0.08202 67928 2067624 readfile 0.00117 0.00191 19192 19208 fpassthru 0.00117 0.00184 20016 20032
    • 9. 保存变量值 被引用的次数 是否为引用 变量的类型
    • 10. 保存变量值 被引用的次数 是否为引用 变量的类型
    • 11. 8 bytes 4 bytes 1 bytes 1 bytes
    • 12. 8 bytes 4 bytes 1 bytes 1 bytes
    • 13. <?php $a = 123; $b = “123”; $c = array( 5=>”a”, “ a”=>10 ); ?> zval *a; MAKE_STD_ZVAL(a); ZVAL_LONG(a, 123); ZEND_SET_SYMBOL(EG(active_symbol_table), &quot; a &quot; , a); zval *b; MAKE_STD_ZVAL(b); ZVAL_STRING(b, “ 123 ” , 1); // 参数 1 指定自动分配空间 ZEND_SET_SYMBOL(EG(active_symbol_table), &quot; b &quot; , b); zval *c; MAKE_STD_ZVAL(c); array_init(c); add_index_string(c, 5, &quot;a&quot;, 1); add_assoc_long(c, &quot;a&quot;, 10); ZEND_SET_SYMBOL(EG(active_symbol_table), “ c &quot; , c);
    • 14. function hello($a, $b = “world”) { echo $a . $b; } PHP_FUNCTION(hello) { char *a, *b = “world”; int a_len, b_len = sizeof(“world”) – 1; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &quot;s|s&quot;, &a, &a_len, &b, &b_len)) { PHPWRITE(a, a_len); PHPWRITE(b, b_len); } } 所有 | 以后的都为可选参数
    • 15. zend_parse_parameters() 参数类型 变量类型 a 数组 (array) b 布尔值 (boolean) d 浮点数值 (floating point) l 整形 (integer) o 实例对像 (object instance) O 指定类型的对像 (object instance of a specified type) r 资源类型 (resource) s 字串 (string) z 任意类型 (non-specific zval) Z 地址传递 (dereferenced non-specific zval)
    • 16. function my_func($a, $b) { return $a + $b; } PHP_FUNCTION(my_func) { zval *a, *b; if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, &quot;zz&quot;, &a, &b)) { convert_to_long(a); convert_to_long(b); return_value ->type = IS_LONG; return_value ->value.lval = a->value.lval + b->value.lval; return; } } 类型转换
    • 17. 获取域名信息服务主服务器地址: http://www.iana.org/root-whois/ Whois 查询过程
      • 连接 Whois Server 服务端口 (default 43)
      • 发送查询命令,以 rn 作为结束符
      • 接收查询结果
      • 服务端发送完结果后会断开端口的连接
      • 参见 RFC954 (http://www.ietf.org/rfc/rfc954.txt)
    • 18.
      • 连接 Server (43)
      • 发送查询
      • 接收信息
      • 检查返回信息
      • 发现完整信息
      • 服务器地址, 跳到步骤 1.
      • 查询结果,构造
      • 返回结果返回
      • Userland.
    • 19. server_list.h 所有域名信息服务主服务器地址 php_whois.h 扩展头文件 whois.c 扩展主程序文件 whois.php 测试文件
    • 20. 查询是一个正常的域名或 IP 地址 ?
    • 21. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址
    • 22. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上
    • 23. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket 进域名信息服务器通讯
    • 24. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket 进域名信息服务器通讯 Userland 接口
    • 25. Socket 工作模式: 阻塞模式 | 非阻塞模式 | I/O 多路复用 | 信号驱动 I/O | 异步 I/O ( 避免堵塞 )
    • 26. 返回结果为 Array() 时超
    • 27. ?
    • 28. 目标: 在 Apache 扩展为依托记录指定文件的点击次数 关键词: IPC Shared memory 内存消耗: 每个 文件被 Hash 后只有 4 个字节 ( i386 ), 假定 10000 个文件 10000 * 4 / 1024 = 39.1 Kbytes 性能消耗: 通常在 PHP 等脚本中写 DB / 文件 / Memcache 来记录点击次数 它的性能和 Apache 的 access_log 相比还是有差距的,而 Apache 写日志要对文件进行操作,与读写内存操作的 Apache 模块来说性 价比又是一个差距。 注: APR 是 Apache portable runtime 的简写
    • 29. Apache 运行期间与模块的交互
    • 30. 模块编写: 1. 注册一个 Apache module, 类型为所有 module 完成 后再调用此 module( APR_HOOK_LAST ) 2. 对每个访问的 URI 进行过虑 , 符合指定记录类型的文件 就进行统计 ( 类型由 httpd.conf 中设定 ) 3. 统计开始时挂载共享内存 , 第一次挂载 的时候共享内存 不存在 , 需要向 Apache 申请共享内存 空间 . 4. 循环共享内存中的数据 , 如果 请求 URI 的 key 和共享内存 中已保存的某条记录相匹配 , 则将该 key 的计数器累加 5. 从当前进程空间中卸载挂进来的共享内存空间 6. 模块返回“不做任何处理”的代码 (return DECLINED )
    • 31. 访问的文件不存在
      • 循环统计队列中的文件列表,找到 Hash Key 就将该 Key 的 acc 累加 1 ,未找到则将该 Hash 添加到队列中 .
      • 当队列中的所有的文件被点击 N 次之后会将队列中的数据写入磁盘文件,重置队列中所有 Hash 的累加器为 0
    • 32. 队列中所有文件访问次数之和 文件的 Hash key
    • 33. ?
    • 34. 相关 文件放在 http://code.google.com/p/php-whois
    • 35. 夏学锋 [email_address]

    ×