- 浏览: 338961 次
文章分类
最新评论
-
亚当爱上java:
"给pre-commit添加可执行权限:chmod ...
svn强制要求提交注释--pre-commit钩子 -
rosasyou:
不知道这篇文章是怎么才让人看的?估计不是浏览器兼容问题。 ,与 ...
Zend Framework的DB处理 -
jinjiankang:
$youngest=`svnlook youngest $sv ...
svn备份策略 -
wangxc:
你好,我按照你介绍的方法在创建完weekly_backup.p ...
svn备份策略 -
yangfuchao418:
...
关于memcached的浅见
根据上面的定义,我们知道,statement包括:
By Altair, http://www.phpinternals.com 转载请注明本信息
昨天有位朋友在杭州的PHPer群里面贴出了下面的一段代码并给出了运行结果:
源程序:
<?php
function doTicks ()
{
echo 'Ticks';
}
register_tick_function('doTicks');
declare(ticks = 1) {
for ($x = 1; $x < 10; ++ $x) {
echo $x * $x . '<br />';
}
}
?>运行结果:
(1) 为什么先输出1之后才输出“Ticks”?
(2) 为什么在输出81后还输出四个Ticks ?
(3) declare中的for循环怎么分解成低级语句(low-level)?
这是每个初次接触ticks的人都会碰到的问题。首先register_tick_function函数定义了每个tick事件发生时的处理函数。那么什么是tick事件呢?先看手册上对ticks的解释:
A tick is an event that occurs for every N low-level statements executed by the parser within the declare block. The value for N is specified using ticks=N within the declare blocks's directive section.
The event(s) that occur on each tick are specified using the register_tick_function().
这个解释有三层意思:(1) tick是一个事件。(2) tick事件在PHP每执行N条低级语句就发生一次,N由declare语句指定。(3)可以用register_tick_function()来指定tick事件发生时应该执行的操作。
很明显,理解上面的输出结果最关键的是了解什么是低级语句(low-level statements),它又是如何进行计数的。我们首先还是将上面的程序通过OPDUMP编译成OPCODEs:
[php]
1: <?php
0 NOP
2:
3: function doTicks ()
4: {
5: echo 'Ticks';
0 ECHO 'Ticks'
6: }
1 RETURN null
7: register_tick_function('doTicks');
1 SEND_VAL 'doTicks'
2 DO_FCALL 'register_tick_function' [extval:1]
8: declare(ticks = 1) {
9: for ($x = 1; $x < 10; ++ $x) {
3 ASSIGN !0, 1
4 IS_SMALLER !0, 10 =>RES[~2]
5 JMPZNZ ~2, ->14 [extval:8]
6 PRE_INC !0
7 JMP ->4
10: echo $x * $x . '<br />';
8 MUL !0, !0 =>RES[~4]
9 CONCAT ~4, '<br />' =>RES[~5]
10 ECHO ~5
11 TICKS 1 =>RES[]
11: }
12 TICKS 1 =>RES[]
13 JMP ->6
14 TICKS 1 =>RES[]
12: }
15 TICKS 1 =>RES[]
16 RETURN 1
[/php]很明显,PHP的编译过程已经在编译后每条语句的OPCODE序列中插入了TICKS指令用于处理tick事件。那么这些TICKS是根据什么规则来插入的呢?
我们还是从PHP Zend Engine的源代码中寻找答案。通过简单的文本搜索我们可以知道生成ZEND_TICKS指令的唯一函数是zend_do_ticks(该函数的实现在zend_compile.c中)。现在再从PHP的语法分析文件zend_language_parser.y(PHP使用bison来做语法分析,所有的语法规则均定义在zend_language_parser.y中)中寻找调用zend_do_ticks的地方。再一次使用简单的文本搜索,我们可以得到调用zend_do_ticks的三条语法规则:
同样从unticked_class_declaration_statement的语法定义:
最复杂的是statement,它的核心是下面的定义:
根据上面的定义,我们知道,statement包括:
(1) 简单语句:空语句(就一个;号),return, break, continue, throw, goto, global, static, unset, echo, 内置的HTML文本,分号结束的表达式等均算一个语句。
(2) 复合语句:完整的if/elseif, while, do...while, for, foreach, switch, try...catch等算一个语句。
(3) 语句块:{} 括出来的语句块。
(4) 最后特别的:declare块本身也算一个语句(按道理declare块也算是复合语句,但此处特意将其独立出来)。
所有的statement, function_declare_statement, class_declare_statement就构成了所谓的低级语句(low-level statement)。
现在再来看开始的例子就比较好理解了:
首先完整的for循环算一个语句,但必须要等循环结束才算,因此在编译时for循环里面的echo 算第一个语句。所以第一个doTicks是在第一个echo后执行的,也就是1输出后才发生第一个tick事件。在$x 从1到9的循环中,每个循环包括两个语句,一个echo, 一个for循环。在81输出后,因为echo是一条语句,因此输出第一个ticks. 同时$x=9的这个for循环也结束了,这又是一条语句,输出第二个ticks;开始$x=10的循环,但这时已不满足循环条件,for循环执行结束,这个循环又是一个语句,这时输出第三个ticks。最后declare本身也算一条语句,所以又输出第四个ticks。
说了半天,ticks到底有什么用?实际上可用tick来进行调试,性能测试,实现简单的多任务,或者做一些后台的I/O操作等等。大家可以在网页http://www.php.net/manual/en/control-structures.declare.php
后面找到一些有趣的tick的应用。
发表评论
-
图片压缩的一些心得
2010-11-03 11:45 1951http://blog.lizhigang.net/arc ... -
PHP程序员面临的成长瓶颈
2010-10-25 10:06 1974作为Web开发中应用最广泛的语言之一,PHP有着大量的粉丝 ... -
URL重写相关
2010-07-26 18:13 1149初级URL重写指南 http://lamp.lin ... -
关于PHP的mod_rewrite重写模块技术个人觉得最好的一篇文章
2010-07-26 09:30 2182最近手里一个PHP项目要用到mod_rewrite模块,很 ... -
php多线程编程
2010-07-21 23:52 983http://www.cnblogs.com/niniwzw/ ... -
php pcntl_fork和pcntl_fork 的用法
2010-07-21 22:23 2099http://www.jb51.net/article/177 ... -
探讨高并发写入文件内容
2010-07-11 22:48 2787读写相关的问题是永远存在的,文件锁就是为了解决这个问题而做的, ... -
php中,高并发状态下文件的读写
2010-07-11 22:28 8741对于日IP不高或者说并发数不是很大的应用,一般不用考虑这些 ... -
HTTP POST from PHP, without cURL
2010-07-06 17:28 1581Update May 2010: This is one ... -
php fsockopen解决办法。
2010-07-06 15:07 3142Author:David | English Ver ... -
用 PHP V5 开发多任务应用程序
2010-07-04 00:39 1181http://www.ibm.com/developerw ... -
git使用总结
2010-07-02 23:51 1279http://zhwen.org/?p=articles/gi ... -
Linux消息队列原理与应用
2010-07-02 18:03 9444http://www.wanglong-neu.cn/ ... -
我说PHPer的水平区分(转载)
2010-07-02 10:55 1416说句实话,写这个真够无 ... -
正则表达式解题经验谈
2010-06-29 22:08 1052正则表达式解题经验谈 ... -
深入浅出之正则表达式
2010-06-28 21:14 762dragon.cnblogs.com/archive/2006 ... -
stream_set_blocking让程序无阻塞
2010-06-28 09:48 1346stream_set_blocking让程序 ... -
什么是Socket?Socket协议的形象描述
2010-06-28 00:11 1546socket的英文原义是“ ... -
完善匹配中文的Php正则表达式
2010-06-11 16:15 2252这段时间试图使用php正 ... -
php反射
2010-06-07 20:14 14811。用途: 该扩展分析php程序,导出或提取出关于类、方法、属 ...
相关推荐
C-tick_ATS01pdf,C-tick_ATS01
前端开源库-call-next-tick调用next tick,在next tick上调用回调,这样可以避免期望异步不会立即执行的代码的疯狂。
Telemecanique certificate c-tickpdf,Telemecanique certificate c-tick
施耐德变频器C-Tick-ATV61/ATV71产品规格pdf,施耐德变频器C-Tick-ATV61/ATV71说明书
C-Tick ATV21 for 400V H and W(英文)pdf,C-Tick ATV21 for 400V H and W(英文)
这只不过是对 v8 源代码附带的“tick 处理器”的重新打包。 安装 $ npm install -g node-tick-processor 用法 在启用分析的情况下运行脚本,以生成v8.log文件$ node --prof myscript.js 在同一个目录下,运行这个...
在图示窗口记录显示tick数据。
适配文章:SYDTEK 使用Systemtick来做延时[改良版]
React Tick-Tac-Toe游戏执照即将来临!描述一个简单的井字游戏先决条件设置您的壁虱游戏开发环境如果您尚未安装Node,请从自制软件或使用Node官方网站Nodejs.org下载版本10.16.2。 一旦安装了Node和NPM。 您应该通过...
matlab开发-datetick2。这个简单的脚本是ploty的datetick扩展。
上期CTP API C++ 源代码 单合约版 下载文件名AutoTrader_ctp_c++源代码.rar 填入经纪公司代码,实盘帐号,密码即可完成行情接收,指标计算,实盘下单连续开平仓。 功能简要介绍如下: 自动保存订阅合约TICK数据到\...
kdb+tick 文档 基于q语言的 内存数据库, 支持billion级的数据秒级查询
监控演示:Docker-ELK-Tick Stack-Grafana-Kafka
这是TICK堆栈沙箱,已转换为Azure IoT Edge AZ-iot-edge-tick 在Azure IoT Edge上打勾 这是,已转换为Azure IoT Edge。 内容 文件夹 描述 docker-compose.yml 用于构建和运行此解决方案的docker-compose文件。 ...
var Tick = requrie("bpm-tick"); var b = new Tick(128); b.register('beat', function (x) { console.log("bam"); }); b.register('bar' , function (x) { console.log("badam"); }); b.play(); 它使用Date所以它...
如果您在提交消息,分支名称方面有不同的约定,或者只是使用其他的源管理工具,则还可以在首选项中根据需要定制输出格式。 Tickety-Tick可帮助您为一些票务系统创建分支和提交。 目前,我们支持:-GitHub-GitLab-...
frp-tick 将返回事件的函数。 该事件将在 requestAnimationFrame 评估时触发。 该事件将返回自上次调用以来的毫秒差异。 用法 例子 var tick = require ( 'frp-tick' ) ; var event = tick ( ) ; // created a new...
$ npm install throw-next-tick --save 用法 可以用作对promises的.done替代品: var throwNextTick = require ( 'throw-next-tick' ) ; promiseOfSomething . then ( function ( something ) { ... } ) . catch ...
React滴答声倒数计时器的简单组件npm install react-tick-tock --save例子var Timer = require ( 'react-tick-tock' ) ;var RenderTag = React . createClass ( { render : function ( ) { return ( < Div> { this ....
p2p-tick-tac-toe 要使用Peer.js制作点对点游戏。