一个使用php做多进程的例子

yorgo 2001-07-25 03:06:54
PHP is not multithreaded. The "Ticks" feature is a way to get some of the benefits of multithreading.

<?
function foo($str) {
static $i = 0;

print "$str: $i<br>\n";
$i++;
}

register_tick_function("foo", "count");

declare (ticks = 6) {

for($i=0; $i<20; $i++) {
echo "$i<br>\n";
}

}
?>


Output:
0
1
2
count: 0
3
4
5
count: 1
6
7
8
count: 2
9
10
11
count: 3
12
13
14
count: 4
15
16
17
count: 5
18
19
count: 6

欢迎大家激烈讨论
...全文
295 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
luncif 2001-07-28
  • 打赏
  • 举报
回复
请注意,PHP是解释执行的,所以tick=n是指执行了n条low-level语句就调用
所定义的函数。
从解释执行low-level来看,下面的语句实际上是38条语句,而每执行6条就调用定义
的函数,如果最后不足6条,还是会调用。
for($i=0; $i<20; $i++) {
echo "$i<br>\n";
}

neusoftlan 2001-07-28
  • 打赏
  • 举报
回复
php还能这样用,好玩儿。
yrs 2001-07-27
  • 打赏
  • 举报
回复
对不起,“秒”是我想当然得出来的结论,从实际执行来看应该是错的。
不对的地方大家尽管敲砖头(最好不要打脸)。 :)
flowerbacket 2001-07-27
  • 打赏
  • 举报
回复
惨。。。

根本没听过。。。

:)

希望大家给个解释啊!
yrs 2001-07-26
  • 打赏
  • 举报
回复

<?
/* 定义一个函数 */
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.
我这样理解不知道对不对,请指正。
一些用词可能不够专业,大家多包涵。 :)
24680 2001-07-26
  • 打赏
  • 举报
回复
很厉害嘛,看过很多英文资料吧。呵。。。
向你们学习了。
肖尧19 2001-07-26
  • 打赏
  • 举报
回复
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的值有什么关系。

上班了……你们讨论吧:)
andyda 2001-07-26
  • 打赏
  • 举报
回复
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秒吗???!!!
「已注销」 2001-07-25
  • 打赏
  • 举报
回复
register_tick_function是什么?declare是什么?
高手能否解释其运行机制,为什么会出现这种结果?
我只有PHP的经验,没有用其它语言写multithread(应是多线程吧?)的经验。
谢了
yorgo 2001-07-25
  • 打赏
  • 举报
回复
register_tick_function

这个东西感觉象是事件声明,注册完的函数就会按照一定规则被调用
chaing 2001-07-25
  • 打赏
  • 举报
回复
register_tick_function是什么東東?????
孟子E章 2001-07-25
  • 打赏
  • 举报
回复
你给PHP带来了新鲜空气,谢谢您的例子!!!!

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧