Php

797 views

Published on

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
797
On SlideShare
0
From Embeds
0
Number of Embeds
21
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

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

    1. 2. <ul><li>调优业务逻辑 ( 简化 / 拆分业务逻辑 ) </li></ul><ul><li>缓存访问量大的数据 ( 文件 / 内存 / Memcache ) </li></ul><ul><li>优化 / 压缩输出内容 ( css / j s / html / ob_start ()) </li></ul><ul><li>优化数据结构 ( database ) </li></ul><ul><li>缓存加速 PHP 代码 ( APC / Zend Optimizer / </li></ul><ul><li>XCache ) </li></ul>
    2. 3. 合理使用静态方法 提高执行效率 50%
    3. 4. 脚本载入即增加常量到全局常量表中 ( 易混淆 ) 类被实例化后保存在类内部常量表中
    4. 5. 尽量少用 @ 操作符
    5. 6. 代码简短并不一定高效
    6. 7. <ul><li>对纯文本文件或不需要 PHP 进行解析文件的读取并输出 </li></ul><ul><ul><li>file_get_contents / file </li></ul></ul><ul><ul><li>fread / fgets </li></ul></ul><ul><ul><li>require / include / require_once / include_once </li></ul></ul><ul><ul><li>readfile </li></ul></ul><ul><ul><li>fpassthru </li></ul></ul><ul><ul><li>应用范围: </li></ul></ul><ul><ul><li>文件下载 / 包含静态(缓存)文件 / 读取配置文件 等 </li></ul></ul><ul><ul><li>优化方法: </li></ul></ul><ul><ul><li>理解每个函数的运行过程,有针对性的使用相关函数 </li></ul></ul>
    7. 8. <ul><li>readfile 和 fpassthru 直接调用 php_stream_passthru 将文件读到内存中 </li></ul><ul><li>fgets / file / file_get_contents 调用 php_stream_open_wrapper_* 封装函数 </li></ul><ul><li>include / require 调用 zend_stream_open () </li></ul>常用读取文件函数的执行效率 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
    8. 9. 保存变量值 被引用的次数 是否为引用 变量的类型
    9. 10. 保存变量值 被引用的次数 是否为引用 变量的类型
    10. 11. 8 bytes 4 bytes 1 bytes 1 bytes
    11. 12. 8 bytes 4 bytes 1 bytes 1 bytes
    12. 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);
    13. 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); } } 所有 | 以后的都为可选参数
    14. 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)
    15. 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; } } 类型转换
    16. 17. 获取域名信息服务主服务器地址: http://www.iana.org/root-whois/ Whois 查询过程 <ul><li>连接 Whois Server 服务端口 (default 43) </li></ul><ul><li>发送查询命令,以 rn 作为结束符 </li></ul><ul><li>接收查询结果 </li></ul><ul><li>服务端发送完结果后会断开端口的连接 </li></ul><ul><li>参见 RFC954 (http://www.ietf.org/rfc/rfc954.txt) </li></ul>
    17. 18. <ul><li>连接 Server (43) </li></ul><ul><li>发送查询 </li></ul><ul><li>接收信息 </li></ul><ul><li>检查返回信息 </li></ul><ul><li>发现完整信息 </li></ul><ul><li>服务器地址, 跳到步骤 1. </li></ul><ul><li>查询结果,构造 </li></ul><ul><li>返回结果返回 </li></ul><ul><li>Userland. </li></ul>
    18. 19. server_list.h 所有域名信息服务主服务器地址 php_whois.h 扩展头文件 whois.c 扩展主程序文件 whois.php 测试文件
    19. 20. 查询是一个正常的域名或 IP 地址 ?
    20. 21. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址
    21. 22. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上
    22. 23. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket 进域名信息服务器通讯
    23. 24. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket 进域名信息服务器通讯 Userland 接口
    24. 25. Socket 工作模式: 阻塞模式 | 非阻塞模式 | I/O 多路复用 | 信号驱动 I/O | 异步 I/O ( 避免堵塞 )
    25. 26. 返回结果为 Array() 时超
    26. 27. ?
    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 的简写
    28. 29. Apache 运行期间与模块的交互
    29. 30. 模块编写: 1. 注册一个 Apache module, 类型为所有 module 完成 后再调用此 module( APR_HOOK_LAST ) 2. 对每个访问的 URI 进行过虑 , 符合指定记录类型的文件 就进行统计 ( 类型由 httpd.conf 中设定 ) 3. 统计开始时挂载共享内存 , 第一次挂载 的时候共享内存 不存在 , 需要向 Apache 申请共享内存 空间 . 4. 循环共享内存中的数据 , 如果 请求 URI 的 key 和共享内存 中已保存的某条记录相匹配 , 则将该 key 的计数器累加 5. 从当前进程空间中卸载挂进来的共享内存空间 6. 模块返回“不做任何处理”的代码 (return DECLINED )
    30. 31. 访问的文件不存在 <ul><li>循环统计队列中的文件列表,找到 Hash Key 就将该 Key 的 acc 累加 1 ,未找到则将该 Hash 添加到队列中 . </li></ul><ul><li>当队列中的所有的文件被点击 N 次之后会将队列中的数据写入磁盘文件,重置队列中所有 Hash 的累加器为 0 </li></ul>
    31. 32. 队列中所有文件访问次数之和 文件的 Hash key
    32. 33. ?
    33. 34. 相关 文件放在 http://code.google.com/p/php-whois
    34. 35. 夏学锋 [email_address]

    ×