你给PHP带来了新鲜空气,谢谢您的例子!!!!

解决方案 »

  1.   

    register_tick_function是什么東東?????
      

  2.   

    register_tick_function这个东西感觉象是事件声明,注册完的函数就会按照一定规则被调用
      

  3.   

    register_tick_function是什么?declare是什么?
    高手能否解释其运行机制,为什么会出现这种结果?
    我只有PHP的经验,没有用其它语言写multithread(应是多线程吧?)的经验。
    谢了
      

  4.   


    <?
    /* 定义一个函数 */
    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.
    我这样理解不知道对不对,请指正。
    一些用词可能不够专业,大家多包涵。 :)
      

  5.   

    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秒吗???!!!
      

  6.   

    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的值有什么关系。上班了……你们讨论吧:)
      

  7.   

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