一个使用php做多进程的例子 你给PHP带来了新鲜空气,谢谢您的例子!!!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 register_tick_function是什么東東????? register_tick_function这个东西感觉象是事件声明,注册完的函数就会按照一定规则被调用 register_tick_function是什么?declare是什么?高手能否解释其运行机制,为什么会出现这种结果?我只有PHP的经验,没有用其它语言写multithread(应是多线程吧?)的经验。谢了 <?/* 定义一个函数 */function foo($str) { static $i = 0; print "$str: $i<br>\n"; $i++;}/* 将此函数声明为一个时间触发器 */register_tick_function("foo" /* 函数名 */, "count" /* 传递给函数foo的参数 */);declare (ticks = 6 /* 触发时间间隔 */) { /* 以下为主流程代码 */ for($i=0; $i<20; $i++) { echo "$i<br>\n"; }}?> 整个程序即为,在打印从0--20的过程中,每6秒执行一次函数foo.我这样理解不知道对不对,请指正。一些用词可能不够专业,大家多包涵。 :) 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. 中的N low-level statements是指N秒吗???!!! ticks=int i这个i的单位绝对不可能是秒!这个程序重结果来看,它将foo函数的调用和declare块中的执行分为两个不同的线程,事实上它确实模拟出了一点多线程的效果(只是一点),我没有弄懂N low-level statements很清晰的意思,但是单位不该是秒,如果是秒,6秒才调用一次,那么我们要看到这个程序的完整效果该用多少秒呢,打印了7次,42秒!但是事实上我们在浏览器中一敲回车,结果就出来了。所以我更相信这个6是6毫秒。其实单位是“秒”还是其他什么都是还是次要的,关键在于指定了ticks的值意味着什么,在JAVA中sleep(time),time被指定为当前线程休眠毫秒数,但是在这里我认为是另外的意思,试着把程序改一下:ticks=1,ticks=2,ticks=3……到ticks=10的结果都有什么不同,如果把ticks改的再大点,你会发现foo函数根本不被执行。我得出了一点结论:ticks规定了declare 块中的代码的单位执行时间,如果在单位执行时间内没有将代码执行完,就执行注册的另一个函数,下次接着执行,直到declare 块的代码被执行完。将ticks改成大值后,块中的代码一次就可以执行完,所以foo就不用执行了,上面的例子也是这样的,count 6打印完了,程序就结束了。上面只是我的一些猜测,但是有个问题我没有猜出来,foo()的单位执行次数和ticks的值有什么关系。上班了……你们讨论吧:) 请注意,PHP是解释执行的,所以tick=n是指执行了n条low-level语句就调用所定义的函数。从解释执行low-level来看,下面的语句实际上是38条语句,而每执行6条就调用定义的函数,如果最后不足6条,还是会调用。for($i=0; $i<20; $i++) { echo "$i<br>\n";} 关于web编程问题,求救 PHP中的转义符问题 php怎么停止程序执行? PHP连接怎么样 SQL server2000 关于foreach输出问题 test 在用gd作图的时候不能用sql语句,为什么?在线! 求救:为什么报错??? 请版主允许我发一个 道歉 mkdir函数后面的八进制参数表那里有或者有谁知道,请救命啊,我建立的目录手工删除不了,参数为0777 请问如何实现分级菜单的导航栏 关于php发送mail的问题,急切想知道,请大家多多关注!
高手能否解释其运行机制,为什么会出现这种结果?
我只有PHP的经验,没有用其它语言写multithread(应是多线程吧?)的经验。
谢了
<?
/* 定义一个函数 */
function foo($str) {
static $i = 0; print "$str: $i<br>\n";
$i++;
}
/* 将此函数声明为一个时间触发器 */
register_tick_function("foo" /* 函数名 */, "count" /* 传递给函数foo的参数 */);declare (ticks = 6 /* 触发时间间隔 */) {
/* 以下为主流程代码 */
for($i=0; $i<20; $i++) {
echo "$i<br>\n";
}}
?> 整个程序即为,在打印从0--20的过程中,每6秒执行一次函数foo.
我这样理解不知道对不对,请指正。
一些用词可能不够专业,大家多包涵。 :)
这个i的单位绝对不可能是秒!这个程序重结果来看,它将foo函数的调用和declare块中的执行分为两个不同的线程,事实上它确实模拟出了一点多线程的效果(只是一点),我没有弄懂N low-level statements很清晰的意思,但是单位不该是秒,如果是秒,6秒才调用一次,那么我们要看到这个程序的完整效果该用多少秒呢,打印了7次,42秒!但是事实上我们在浏览器中一敲回车,结果就出来了。所以我更相信这个6是6毫秒。其实单位是“秒”还是其他什么都是还是次要的,关键在于指定了ticks的值意味着什么,在JAVA中sleep(time),time被指定为当前线程休眠毫秒数,但是在这里我认为是另外的意思,试着把程序改一下:
ticks=1,ticks=2,ticks=3……到ticks=10的结果都有什么不同,如果把ticks改的再大点,你会发现foo函数根本不被执行。
我得出了一点结论:ticks规定了declare 块中的代码的单位执行时间,如果在单位执行时间内没有将代码执行完,就执行注册的另一个函数,下次接着执行,直到declare 块的代码被执行完。
将ticks改成大值后,块中的代码一次就可以执行完,所以foo就不用执行了,上面的例子也是这样的,count 6打印完了,程序就结束了。
上面只是我的一些猜测,但是有个问题我没有猜出来,foo()的单位执行次数和ticks的值有什么关系。上班了……你们讨论吧:)
所定义的函数。
从解释执行low-level来看,下面的语句实际上是38条语句,而每执行6条就调用定义
的函数,如果最后不足6条,还是会调用。
for($i=0; $i<20; $i++) {
echo "$i<br>\n";
}