SlideShare ist ein Scribd-Unternehmen logo
1 von 35
 
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
合理使用静态方法 提高执行效率 50%
脚本载入即增加常量到全局常量表中 ( 易混淆 ) 类被实例化后保存在类内部常量表中
尽量少用 @ 操作符
代码简短并不一定高效
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],常用读取文件函数的执行效率 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 bytes 4 bytes 1 bytes 1 bytes
8 bytes 4 bytes 1 bytes 1 bytes
<?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);
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); } } 所有  |  以后的都为可选参数
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)
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; } } 类型转换
获取域名信息服务主服务器地址:  http://www.iana.org/root-whois/ Whois  查询过程 ,[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
server_list.h  所有域名信息服务主服务器地址 php_whois.h 扩展头文件 whois.c  扩展主程序文件 whois.php 测试文件
查询是一个正常的域名或  IP 地址 ?
查询是一个正常的域名或  IP 地址 ? 从域名后缀提取主域名服务器地址
查询是一个正常的域名或  IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上
查询是一个正常的域名或  IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket  进域名信息服务器通讯
查询是一个正常的域名或  IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket  进域名信息服务器通讯 Userland  接口
Socket  工作模式: 阻塞模式  |  非阻塞模式  |  I/O 多路复用  |  信号驱动 I/O | 异步 I/O ( 避免堵塞 )
返回结果为  Array() 时超
?
目标: 在  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  的简写
Apache  运行期间与模块的交互
模块编写: 1.  注册一个  Apache module,  类型为所有 module 完成  后再调用此 module( APR_HOOK_LAST ) 2.  对每个访问的 URI 进行过虑 ,  符合指定记录类型的文件 就进行统计 ( 类型由 httpd.conf   中设定 ) 3.  统计开始时挂载共享内存 ,  第一次挂载 的时候共享内存 不存在 ,  需要向 Apache 申请共享内存 空间 . 4.  循环共享内存中的数据 ,  如果 请求 URI 的 key 和共享内存 中已保存的某条记录相匹配 ,  则将该 key 的计数器累加 5.  从当前进程空间中卸载挂进来的共享内存空间 6.  模块返回“不做任何处理”的代码 (return  DECLINED )
访问的文件不存在 ,[object Object],[object Object]
队列中所有文件访问次数之和 文件的  Hash key
?
相关 文件放在  http://code.google.com/p/php-whois
夏学锋 [email_address]

Weitere ähnliche Inhalte

Was ist angesagt? (12)

编辑器设计U editor
编辑器设计U editor编辑器设计U editor
编辑器设计U editor
 
S1: InnoDB AIO原理及相关bug分析
S1: InnoDB AIO原理及相关bug分析S1: InnoDB AIO原理及相关bug分析
S1: InnoDB AIO原理及相关bug分析
 
advanced introduction to codeigniter
advanced introduction to codeigniteradvanced introduction to codeigniter
advanced introduction to codeigniter
 
钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会钟志 第八期Web标准化交流会
钟志 第八期Web标准化交流会
 
Altibase管理培训 安装篇
Altibase管理培训 安装篇Altibase管理培训 安装篇
Altibase管理培训 安装篇
 
Perl在nginx里的应用
Perl在nginx里的应用Perl在nginx里的应用
Perl在nginx里的应用
 
新北市教師工作坊 -- Bash script programming 介紹
新北市教師工作坊 -- Bash script programming 介紹新北市教師工作坊 -- Bash script programming 介紹
新北市教師工作坊 -- Bash script programming 介紹
 
Hadoop 設定與配置
Hadoop 設定與配置Hadoop 設定與配置
Hadoop 設定與配置
 
Patterns in Zend Framework
Patterns in Zend FrameworkPatterns in Zend Framework
Patterns in Zend Framework
 
部分PHP问题总结[转贴]
部分PHP问题总结[转贴]部分PHP问题总结[转贴]
部分PHP问题总结[转贴]
 
Hadoop 簡介 教師 許智威
Hadoop 簡介 教師 許智威Hadoop 簡介 教師 許智威
Hadoop 簡介 教師 許智威
 
Erlang Practice
Erlang PracticeErlang Practice
Erlang Practice
 

Andere mochten auch (8)

El hobbit
El hobbitEl hobbit
El hobbit
 
Hobbit
HobbitHobbit
Hobbit
 
El hobbit
El hobbitEl hobbit
El hobbit
 
The Hobbit
The HobbitThe Hobbit
The Hobbit
 
The Hobbit
The HobbitThe Hobbit
The Hobbit
 
Hobbit
HobbitHobbit
Hobbit
 
El hobbit
El hobbitEl hobbit
El hobbit
 
The Hobbit - Mapping Bilbo's Journey
The Hobbit - Mapping Bilbo's JourneyThe Hobbit - Mapping Bilbo's Journey
The Hobbit - Mapping Bilbo's Journey
 

Ähnlich wie Php

Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
yiditushe
 
MySQL新技术探索与实践
MySQL新技术探索与实践MySQL新技术探索与实践
MySQL新技术探索与实践
Lixun Peng
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
锐 张
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程
Lixun Peng
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
QLeelulu
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)
Wei Sun
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
Tony Deng
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
zhen chen
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
Frank Xu
 

Ähnlich wie Php (20)

PHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming SkillsPHP Coding Standard and 50+ Programming Skills
PHP Coding Standard and 50+ Programming Skills
 
Erlang游戏开发
Erlang游戏开发Erlang游戏开发
Erlang游戏开发
 
高性能LAMP程序设计
高性能LAMP程序设计高性能LAMP程序设计
高性能LAMP程序设计
 
Glider
GliderGlider
Glider
 
Lucene 全文检索实践
Lucene 全文检索实践Lucene 全文检索实践
Lucene 全文检索实践
 
MySQL新技术探索与实践
MySQL新技术探索与实践MySQL新技术探索与实践
MySQL新技术探索与实践
 
Lamp高性能设计
Lamp高性能设计Lamp高性能设计
Lamp高性能设计
 
缓存技术浅谈
缓存技术浅谈缓存技术浅谈
缓存技术浅谈
 
构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接 构建ActionScript游戏服务器,支持超过15000并发连接
构建ActionScript游戏服务器,支持超过15000并发连接
 
Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計Hadoop Map Reduce 程式設計
Hadoop Map Reduce 程式設計
 
MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程MySQL源码分析.01.代码结构与基本流程
MySQL源码分析.01.代码结构与基本流程
 
應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局應用Ceph技術打造軟體定義儲存新局
應用Ceph技術打造軟體定義儲存新局
 
Mybatis学习培训
Mybatis学习培训Mybatis学习培训
Mybatis学习培训
 
Php应用程序常见安全问题解析
Php应用程序常见安全问题解析Php应用程序常见安全问题解析
Php应用程序常见安全问题解析
 
Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档Oraliux+mysql5单机多实例安装文档
Oraliux+mysql5单机多实例安装文档
 
Node.js开发体验
Node.js开发体验Node.js开发体验
Node.js开发体验
 
Using google appengine (2)
Using google appengine (2)Using google appengine (2)
Using google appengine (2)
 
非常靠谱 Html 5
非常靠谱 Html 5 非常靠谱 Html 5
非常靠谱 Html 5
 
Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储 Ria的强力后盾:rest+海量存储
Ria的强力后盾:rest+海量存储
 
使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统使用NodeJS构建静态资源管理系统
使用NodeJS构建静态资源管理系统
 

Php

  • 1.  
  • 2.
  • 4. 脚本载入即增加常量到全局常量表中 ( 易混淆 ) 类被实例化后保存在类内部常量表中
  • 7.
  • 8.
  • 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.
  • 18.
  • 19. server_list.h 所有域名信息服务主服务器地址 php_whois.h 扩展头文件 whois.c 扩展主程序文件 whois.php 测试文件
  • 21. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址
  • 22. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上
  • 23. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket 进域名信息服务器通讯
  • 24. 查询是一个正常的域名或 IP 地址 ? 从域名后缀提取主域名服务器地址 详细信息在别的域名信息服务器上 调用 Socket 进域名信息服务器通讯 Userland 接口
  • 25. Socket 工作模式: 阻塞模式 | 非阻塞模式 | I/O 多路复用 | 信号驱动 I/O | 异步 I/O ( 避免堵塞 )
  • 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 的简写
  • 30. 模块编写: 1. 注册一个 Apache module, 类型为所有 module 完成 后再调用此 module( APR_HOOK_LAST ) 2. 对每个访问的 URI 进行过虑 , 符合指定记录类型的文件 就进行统计 ( 类型由 httpd.conf 中设定 ) 3. 统计开始时挂载共享内存 , 第一次挂载 的时候共享内存 不存在 , 需要向 Apache 申请共享内存 空间 . 4. 循环共享内存中的数据 , 如果 请求 URI 的 key 和共享内存 中已保存的某条记录相匹配 , 则将该 key 的计数器累加 5. 从当前进程空间中卸载挂进来的共享内存空间 6. 模块返回“不做任何处理”的代码 (return DECLINED )
  • 31.
  • 33. ?
  • 34. 相关 文件放在 http://code.google.com/p/php-whois

Hinweis der Redaktion

  1. [email_address]
  2. [email_address]
  3. AddHandler staturl .php .html .xyz [email_address]