精华内容
下载资源
问答
  • 2021-04-08 08:07:32

    看到得问里面有人问php中 declare作用,我回答了下,顺便自己记录下。

    一般用法是 declare(ticks=N);

    拿declare(ticks=1)来说,这句主要作用有两种:

    1、Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数。

    可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick函数。

    一个用途就是控制某段代码执行时间,例如下面的代码虽然最后有个死循环,但是执行时间不会超过5秒。

    运行 php timeout.php

    declare(ticks=1);

    // 开始时间

    $time_start = time();

    // 检查是否已经超时

    function check_timeout(){

    // 开始时间

    global $time_start;

    // 5秒超时

    $timeout = 5;

    if(time()-$time_start > $timeout){

    exit("超时{$timeout}秒\n");

    }

    }

    // Zend引擎每执行一次低级语句就执行一下check_timeout

    register_tick_function('check_timeout');

    // 模拟一段耗时的业务逻辑

    while(1){

    $num = 1;

    }

    // 模拟一段耗时的业务逻辑,虽然是死循环,但是执行时间不会超过$timeout=5秒

    while(1){

    $num = 1;

    }

    2、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;

    }

    更多相关内容
  • php declare(ticks=1)

    2019-11-27 23:19:49
    declare(ticks=1)来说,这句主要作用有两种: 1、Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数。 可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick...

    PHP declare(ticks=N); 的作用

     

    一般用法是 declare(ticks=N);
    拿declare(ticks=1)来说,这句主要作用有两种:
    1、Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数。
    可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick函数。
    一个用途就是控制某段代码执行时间,例如下面的代码虽然最后有个死循环,但是执行时间不会超过5秒。
    运行 php timeout.php

     
    1. <?php
    2. declare(ticks=1);
    3.  
    4. // 开始时间
    5. $time_start = time();
    6.  
    7. // 检查是否已经超时
    8. function check_timeout(){
    9.     // 开始时间
    10.     global $time_start;
    11.     // 5秒超时
    12.     $timeout = 5;
    13.     if(time()-$time_start > $timeout){
    14.         exit("超时{$timeout}秒\n");
    15.     }
    16. }
    17.  
    18. // Zend引擎每执行一次低级语句就执行一下check_timeout
    19. register_tick_function('check_timeout');
    20.  
    21. // 模拟一段耗时的业务逻辑
    22. while(1){
    23.    $num = 1;
    24. }
    25.  
    26. // 模拟一段耗时的业务逻辑,虽然是死循环,但是执行时间不会超过$timeout=5秒
    27. while(1){
    28.    $num = 1;
    29. }

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

     
    1. <?php
    2. declare(ticks=1);
    3. pcntl_signal(SIGINT, function(){
    4.    exit("Get signal SIGINT and exit\n");
    5. });
    6.  
    7. echo "Ctl + c or run cmd : kill -SIGINT " . posix_getpid(). "\n" ;
    8.  
    9. while(1){
    10.   $num = 1;
    11. }
    展开全文
  • PHP进程之信号捕捉中的declare(ticks=1)

    千次阅读 2017-03-24 12:01:34
    在使用PHP的PCNTL拓展时,发现在信号捕捉的例程中出现了declare(ticks=1)这条php语句,于是对其进行研究。一. 语句在php中的意义php中,declare(ticks=n)和register_tick_function(‘handel_function’)一般是配合...

    在使用PHP的PCNTL拓展时,发现在信号捕捉的例程中出现了declare(ticks=1)这条php语句,于是对其进行研究。


    一. 语句在php中的意义

    php中,declare(ticks=n)和register_tick_function(‘handel_function’)一般是配合使用的,其作用是在zend解释器每执行 N 条可计时的低级语句就会发生的事件,该事件发生后就可以处理已经注册的函数’handel_function’;


    二. 在使用捕捉信号时使用该语句的思考

    1.linux下应用编程中的signal机制(linux-signal机制资料来源博客《Linux 信号signal处理机制》

    这里写图片描述

    每个进程都会采用一个进程控制块对其进行描述,进程控制块中设计了一个signal的位图信息,其中的每位与具体的signal相对应,这与中断机制是保持一致的。当系统中一个进程A通过signal系统调用向进程B发送signal时,设置进程B的对应signal位图,类似于触发了signal对应中断。发送signal只是“中断”触发的一个过程,具体执行会在两个阶段发生:

    (1)、 system call返回。进程B由于调用了system call后,从内核返回用户态时需要检查他拥有的signal位图信息表,此时是一个执行点。

    (2)、 中断返回。进程被系统中断打断之后,系统将CPU交给进程时,需要检查即将执行进程所拥有的signal位图信息表,此时也是一个执行点。

    综上所述,signal的执行点可以理解成从内核态返回用户态时,在返回时,如果发现待执行进程存在被触发的signal,那么在离开内核态之后(也就是将CPU切换到用户模式),执行用户进程为该signal绑定的signal处理函数,从这一点上看,signal处理函数是在用户进程上下文中执行的。当执行完signal处理函数之后,再返回到用户进程被中断或者system call(软中断或者指令陷阱)打断的地方。

    2.php使用singal为什么需要使用declare(ticks=n)语句

    既然系统内核都提供了完整的signal的机制,第一想到的是,pcntl拓展要实现php的signal-api, 其直接将php方法与底层的singnal函数绑定就能实现了,不是吗?

    (以下对于该问题的答案纯属个人思考)
    答案是否定的,从上面linux中的signal机制可知道,其机制是针对c语言等强语言的,其对代码的中断造成对变量的影响是可控的。

    但是对于PHP这样的脚本语言,一个语句底下可能是n句C语言执行,或者n+m句机器指令,如果在一条语句的执行过程中运行php的signal函数,那么很可能引起php的奔溃;

    那么pcntl拓展怎么解决这个问题了,自然就会想到,如果信号来了先做标记,再等一句完整的php语句执行完了,然后再调用使用pcntl_signal注册的php回调函数,这样就保证了php环境的安全性。

    而php中declare(ticks=n)和register_tick_function(‘handel_function’)就提供了这样的功能;


    结论很清楚了,为了保证php环境的安全性和稳定性,pcntl拓展在实现signal上使用了“延后执行”的机制;因此使用该功能时,必须先使用语句declare(ticks=1),否则注册的singal-handel就不会执行了

    展开全文
  • php declare (ticks = N)

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

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

    functiondebug () {$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 .

    <?phpdeclare (ticks = 1);$timeStart = time();functioncheckTimeout () {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;

    }

    原文:http://www.cnblogs.com/debmzhang/p/4234328.html

    展开全文
  • 转自http://blog.csdn.net/udefined/article/details/24333333、http://blog.csdn.net/fwkjdaghappy1/article/details/7457687 参见:...   一般用法是 declare(ticks=N); 拿declare
  • declare是PHP的流程控制结构,directive目前支持两个指令,ticks的使用需配合register_tick_function函数使用,看下面的小示例吧
  • PHP declare(ticks = N)

    2018-01-23 11:00:00
    今天有同事提到,要在后台脚本(crontab里的,或者daemon)调用pcntl_signal(),但担心declare(ticks = 1)会不会引起系统性能或稳定性方面的问题。   根本上,还是要看看declare(在zend_compile.c中,有tick的相关...
  • declare(ricks = n) 主要有两个作用:  Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数。 可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick函数。 一...
  • 可以是简单的以分号结尾的一条语句;或者完整的if/elseif,while,do...while,for,foreach,switch,try...catch等算一个语句;或者{} 括出来的语句块;...大概了解了低级语句的意思后来看看declare(ticks=N);的...
  • php declare(ticks)

    2014-02-10 11:49:00
    = 1; $x ; ++ $x ) { // echo similar_text(md5($x), md5($x*$x)), " ;"; echo $x .' ' ; } } // Display the data stored in the profiler print_r (profile ( TRUE )); ?>   ...
  • does the fact that I've run <code>declare(ticks=1);</code> have any effect on execution efficiency? Does it cause any extra processing to become permanently enabled anyway? <p>Analysis of PHP(7)'s ...
  • declareticks

    2013-03-07 15:12:36
    declare指令用来设定一段代码的... 其中,directive部分允许设定declare代码段的行为,目前只支持ticks。tick是一个在declare代码段中解释器每执行N条低级语句就会发生的事件。N的值是在declare中的directive部分用t...
  • 什么是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=...
  • php-多进程

    2021-04-29 05:34:00
    php可以利用pcntl扩展写多进程程序//定义ticksdeclare(ticks=1);//产生子进程分支$pid = pcntl_fork();if ($pid == -1) {die("could not fork"); //pcntl_fork返回-1标明创建子进程失败} else if ($pid) {exit(); //...
  • 先看看手册是怎么说的: declare 结构用来设定一段代码...1 declare (directive) 2  statement directive 部分允许设定 declare 代码段的行为。目前只认识两个指
  • declare

    千次阅读 2018-05-24 18:39:19
    declare ticks=1 Example #1 &lt;?php // 例子1 function doTicks () { echo 'Ticks'; } register_tick_function('doTicks'); declare(ticks = 1) { for ($x = 1; $x ...
  • RFC更推荐给每一个PHP文件,添加一句新的可选指令(declare(strict_type=1);),让同一个PHP文件内的全部函数调用和语句返回,都有一个“严格约束”的标量类型声明检查。此外,在开启严格类型约束后,调用拓展或者...
  • PHP的ticks机制

    2021-05-05 01:16:21
    要过年了,在年前完成这篇文章,如果有缘可以看到,祝福看到的朋友新年快乐,在新的一年里,万事顺意!按今年的计划每个月至少有两篇文章,而一月份因为各种理由而只有一篇2012的总结...如:declare(ticks = N); 这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,170
精华内容 868
关键字:

declare (ticks = 1)

友情链接: 201.zip