-
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<?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”退出- <?php
- 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)
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:20declare(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
-
PHP declare(ticks=N); 的作用(转多篇文章)
2017-12-07 09:43:55转自http://blog.csdn.net/udefined/article/details/24333333、http://blog.csdn.net/fwkjdaghappy1/article/details/7457687 参见:... 一般用法是 declare(ticks=N); 拿declare -
php的declare控制符和ticks教程(附示例)
2020-10-26 03:13:30declare是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的相关... -
php declare(ticks=n) 的作用
2017-08-30 17:53:00declare(ricks = n) 主要有两个作用: Zend引擎每执行1条低级语句就去执行一次 register_tick_function() 注册的函数。 可以粗略的理解为每执行一句php代码(例如:$num=1;)就去执行下已经注册的tick函数。 一... -
PHP学习手册五:declare(ticks=N);和php低级语句的概念
2019-03-15 14:38:22可以是简单的以分号结尾的一条语句;或者完整的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 )); ?> ... -
如果我声明(ticks = 1)但没有注册tick函数,那么产生的tick处理会产生什么样的开销呢?
2017-11-04 03:29:09does 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 ... -
declare与ticks
2013-03-07 15:12:36declare指令用来设定一段代码的... 其中,directive部分允许设定declare代码段的行为,目前只支持ticks。tick是一个在declare代码段中解释器每执行N条低级语句就会发生的事件。N的值是在declare中的directive部分用t... -
【php学习笔记】ticks篇
2021-05-05 01:16:14什么是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:00php可以利用pcntl扩展写多进程程序//定义ticksdeclare(ticks=1);//产生子进程分支$pid = pcntl_fork();if ($pid == -1) {die("could not fork"); //pcntl_fork返回-1标明创建子进程失败} else if ($pid) {exit(); //... -
php控制结构语句declare中的tick的详解[整理版]
2016-09-19 11:16:48先看看手册是怎么说的: declare 结构用来设定一段代码...1 declare (directive) 2 statement directive 部分允许设定 declare 代码段的行为。目前只认识两个指 -
declare
2018-05-24 18:39:19declare ticks=1 Example #1 <?php // 例子1 function doTicks () { echo 'Ticks'; } register_tick_function('doTicks'); declare(ticks = 1) { for ($x = 1; $x ... -
PHP 7 标量类型声明 RFC,也可是 declare(strict_types = 1)
2016-09-19 11:15:39RFC更推荐给每一个PHP文件,添加一句新的可选指令(declare(strict_type=1);),让同一个PHP文件内的全部函数调用和语句返回,都有一个“严格约束”的标量类型声明检查。此外,在开启严格类型约束后,调用拓展或者... -
PHP的ticks机制
2021-05-05 01:16:21要过年了,在年前完成这篇文章,如果有缘可以看到,祝福看到的朋友新年快乐,在新的一年里,万事顺意!按今年的计划每个月至少有两篇文章,而一月份因为各种理由而只有一篇2012的总结...如:declare(ticks = N); 这...