php declare (ticks = N)

A tick is an event that occurs for every N low-level tickable 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.

这是PHP中对 declare 中的 ticks 的定义

中文翻译 Tick(时钟周期)是一个在 declare 代码段中解释器每执行 N 条可计时的低级语句就会发生的事件。N 的值是在 declare 中的 directive 部分用ticks=N 来指定的.

我个人理解的大意就是说, tick 这个周期上会绑定一个事件, 这个事件, 当Zend引擎执行到所设置的 tick (就是N) 行低级语句时, 就执行  register_tick_function()  定义的事件

关于什么是低级语句, http://my.oschina.net/Jacker/blog/32936 这篇文章说的很详细, 有时间的话, 可以研究一下的, 涉及到了PHP的底层 zend 引擎.

declare (ticks = N);

这个东西有什么用?

1. 可以用来调试语句, 根据粗体标明的, 不难看出来, 可以用来调试语句, 可以把执行出错的每一行代码记录下来, 可以看出到底是哪里出错了.

<?php
error_reporting(0);

declare(ticks = 1); 

// $result bool
function debug () {
    $debug = debug_backtrace();
    if ($debug) {
        $functionName = $debug[‘function‘];
        if ( !function_exists($functionName) ) {
            // file_put_contents(‘/tmp/declare-debug‘, ‘function is not exists!‘ . "\n", FILE_APPEND);
            exit("function is not exists!\n");
        }
    }
}

register_tick_function(‘debug‘);

atest(‘bb‘);

2. 可以控制程序执行时间, walkor 大神写过, 拿来用一下.  下面是两个死循环, 但是如下这样写, 程序运行时间不会超过5s .

<?php
declare(ticks = 1); 

$timeStart = time();

function checkTimeout () {
    global $timeStart;
    $timeoutSeconds = 5;

    if (time() - $timeStart > $timeoutSeconds) {
        exit (‘超时‘ . "\n");
    }
}

register_tick_function(‘checkTimeout‘);

while (1) {
    $num = 1;
}

while (1) {
    $num = 1;
}

3. walkor大神 所写的第二个是检测信号的, 拿来用一下.

declare(ticks=1);每执行一次低级语句会检查一次该进程是否有未处理过的信号,测试代码如下:
运行 php signal.php 
然后CTL+c 或者 kill -SIGINT PID 会导致运行代码跳出死循环去运行pcntl_signal注册的函数,效果就是脚本exit打印“Get signal SIGINT and exi”退出

declare(ticks=1);
pcntl_signal(SIGINT, function(){
   exit("Get signal SIGINT and exit\n");
});
echo "Ctl + c or run cmd : kill -SIGINT " . posix_getpid(). "\n" ;
while(1){
  $num = 1;
}
时间: 2024-11-08 09:38:30

php declare (ticks = N)的相关文章

走入PHP-declare、ticks、encoding、include

declare 结构用来设定一段代码的执行指令.declare 的语法和其它流程控制结构相似(该代码为语法格式,不是代码案例,无需敲打该代码): declare (directive) statement directive 部分允许设定 declare 代码段的行为.目前只认识两个指令:ticks(更多信息见下面 ticks 指令)以及 encoding(更多信息见下面 encoding 指令). Note: encoding 是 PHP 5.3.0 新增指令. declare 代码段中的 s

【php学习笔记】ticks篇

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是一个事件

php里的declare用法

function tick_handler () { echo "tick_handler() called<br>" ; } function tick_handler1 () { echo "tick_handler1() called<br>" ; } register_tick_function ( 'tick_handler' ); register_tick_function ( 'tick_handler1' ); declar

分享一些无特征PHP一句话

分享些不需要动态函数.不用eval.不含敏感函数.免杀免拦截的一句话.(少部分一句话需要php5.4.8+.或sqlite/pdo/yaml/memcached扩展等) 原理:https://www.leavesongs.com/PENETRATION/php-callback-backdoor.html 所有一句话使用方法基本都是: http:// target/shell.php?e=assert 密码pass 01 $e = $_REQUEST['e'];$arr = array($_PO

PHP进程及进程间通信

一.引言 进程是一个具有独立功能的程序关于某个数据集合的一次运行活动.换句话说就是,在系统调度多个cpu的时候,一个程序的基本单元.进程对于大多数的语言都不是一个陌生的概念,作为"世界上最好的语言PHP"当然也例外. 二.环境 php中的进程是以扩展的形式来完成.通过这些扩展,我们能够很轻松的完成进程的一系列动作. pcntl扩展:主要的进程扩展,完成进程创建于等待操作. posix扩展:完成posix兼容机通用api,如获取进程id,杀死进程等. sysvmsg扩展:实现system

PHP-Gealman

一.简介 Gearman是一个分发任务的程序框架,它会对作业进行排队自动分配到一系列机器上.gearman跨语言跨平台,很方便的实现异步后台任务.php官方收录:http://php.net/manual/zh/book.gearman.php 如上图,一个Gearman请求的处理过程涉及三个角色:Client -> Job -> Worker. Client:请求的发起者,可以是C,PHP,Perl,MySQL UDF等等.Job:请求的调度者,用来负责协调把Client发出的请求转发给合适

php多进程 防止出现僵尸进程

对于用PHP进行多进程并发编程,不可避免要遇到僵尸进程的问题. 僵尸进程是指的父进程已经退出,而该进程dead之后没有进程接受,就成为僵尸进程(zombie)进程.任何进程在退出前(使用exit退出) 都会变成僵尸进程(用于保存进程的状态等信息),然后由init进程接管.如果不及时回收僵尸进程,那么它在系统中就会占用一个进程表项,如果这种僵尸进程过多,最后系统就没有可以用的进程表项,于是也无法再运行其它的程序. 方法一: 父进程通过pcntl_wait和pcntl_waitpid等函数等待子进程

php pcntl 多进程学习

1.捕获子进程退出(监听SIGCHLD信号,然后调用 pcntl_wait 函数) declare(ticks=1); pcntl_signal(SIGCHLD, "sig_handler"); function sig_handler($signo) { switch ($signo) { case SIGCHLD: $status = 0; $child_id = pcntl_wait($status); echo sprintf("child exit id: {$ch

面向对象练习

#break跳出多层循环 $a = 0; while (true) { $a++; switch ($a) { case 1: echo '1'; break; case 2: echo '2'; break; default: echo 'in'; break 2; } } echo 'out'; 输出:1 2 in out 说明: break除了可以在switch里面用,还可以从for.while等循环语句中跳出: break+数字可以支持多重循环的跳出. #continue跳出多重循环 $