【php学习笔记】ticks篇

PHP中的ticks是一个解析事件,每执行N条低级语句触发,通过`declare(ticks=N)`设置。使用`register_tick_function()`和`unregister_tick_function()`管理回调。ticks常用于调试、性能测试和多任务。例子中展示了如何通过ticks模拟消息队列通信,每两步执行一次消息获取。
摘要由CSDN通过智能技术生成

1. 什么是ticks


我们来看一下手册上面对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 block's directive section.


总结一下:

  • tick是一个事件
  • tick事件在每执行N条low-level statements就会放生一次,N由declare语句指定
  • 可以用register_tick_function()来指定时间的handler,unregister_tick_function()与之对应

至于什么是low-level statements,在此不做展开,总结来说,low-level statements包括以下几种情况:

(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本身算一个复合语句

所有的statement, function_declare_statement, class_declare_statement构成了low-level statement.


2. tick的坑

一定要注意的一点是:declare()不是一个函数!!!准确的说,他是说一个语言结构,因此可能会有一些你意想不到的行为,比如说,当你在一个文件当中多次用到declare()时,其解析的原则是:谁在我前面并且理我最近我就用谁,完全无视你的代码逻辑,这里不做展开。一个建议的用法是

declare(ticks=10){
    for($i = 0; $i < 20; $i++){
        print "hello\n";
    }
}

declare(ticks=2){
    for($i = 0; $i < 20; $i++){
        print "hello\n";
    }
}

3. tick的应用

说了这么多,我们到底什么时候会用到tick呢?一般来说,tick可以用作调试,性能测试,实现简单地多任务或者做后台的I/O操作等等。

这边举一个鸟哥提供的范例,用于完成通信

<?php

/*
 * 利用ticks来完成消息通信
 */

//create a message queue
$mesg_key = ftok(__FILE__, 'm');
$mesg_id = msg_get_queue($mesg_key, 0666);

//ticks callback
function fetchMessage($mesg_id) {
    if (!is_resource($mesg_id)) {
        print_r("Mesg Queue is not Ready \n");
    }

    if (msg_receive($mesg_id, 0, $mesg_type, 1024, $mesg, false, MSG_IPC_NOWAIT)) {
        print_r("Process got a new incoming MSG: $mesg \n");
    }
}

//register ticks callback
register_tick_function("fetchMessage", $mesg_id);

//send messages;
declare(ticks = 2) {
    $i = 0;
    while (++$i < 100) {
        if ($i % 5 == 0) {
            msg_send($mesg_id, 1, "Hi: Now Index is :" . $i);
        }
    }
}


我们来看一下输出:


我们发现,由于注册了tick事件的callback,每经过两个statements都会触发tick事件,从而执行了从消息队列当中取消息的操作。这样就模拟了消息的发送和接收的过程。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值