declare 实例

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

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

根据
1
<?
/* 定义一个函数 */
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.

2
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的值有什么关系??

3
请注意,PHP是解释执行的,所以tick=n是指执行了n条low-level语句就调用
所定义的函数。
从解释执行low-level来看,下面的语句实际上是38条语句,而每执行6条就调用定义
的函数,如果最后不足6条,还是会调用。
for($i=0; $i<20; $i++) {
echo "$i<br>\n";
}

http://topic.csdn.net/t/20010725/03/208043.html

你可能感兴趣的:(多线程,PHP,.net,浏览器)