php的pcntl扩展供应了pcntl_signal旗子暗记处理函数,常日有两种办法用于检测注册的旗子暗记。
举例解释两种实现方法。

declare(ticks=1) + pcntl_signal:

declare (ticks = 1);pcntl_signal(SIGINT, \公众sig_handler\"大众);

这段代码在实行pcntl_signal前,先加入了declare(ticks = 1)。
由于PHP的函数无法直接注册到操作系统旗子暗记设置中,以是pcntl旗子暗记须要依赖tick机制。
PHP的ticks=1表示每实行1行PHP代码就回调此函数(这里指pctnl_signal),在PHP的ticks回调函数中不断检讨是否有旗子暗记,如果有旗子暗记就实行PHP中指定的回调函数(这里指 sig_handler),如果没有则跳出函数。
我们用实例解释ticks=1时,Zend引擎每实行一次低级语句就实行一次register_tick_function() 注册的函数。

php注册问题分析PHP实现检测注册的旌旗灯号 React

<?phpdeclare(ticks = 1);function check_ticks(){echo \"大众check_ticks\n\"大众;}register_tick_function('check_ticks');while(true){echo \"大众一段比较耗时的业务逻辑\n\"大众;sleep(1);}

以上代码实行结果截图如下:

图1

从上可知,declare(ticks=1)时,Zend引擎每实行1条低级语句就去实行一次 register_tick_function() 注册的函数。

pcntl_signal+pcntl_signal_dispatch:

<?phpecho \公众安装旗子暗记处理器...\n\"大众;pcntl_signal(SIGHUP, function($signo) {echo \公众旗子暗记处理器被调用\n\公众;});echo \"大众为自己天生SIGHUP旗子暗记...\n\"大众;posix_kill(posix_getpid(), SIGHUP);echo \"大众分发...\n\"大众;pcntl_signal_dispatch();echo \公众完成\n\"大众;

以上代码实行结果如下:

图2

函数pcntl_signal_dispatch()调用每个等待旗子暗记通过pcntl_signal() 安装的处理器。
并没有如利用ticks一样,每次实行1条低级语句就去实行一次注册旗子暗记函数。
利用declare(ticks=1) + pcntl_signal 检测注册的旗子暗记的办法,会带来大量空的函数调用。
这样会摧残浪费蹂躏大量的CPU资源。
pcntl_signal+pcntl_signal_dispatch 避免了这样的问题,但是,值得把稳的是,pcntl_signal_dispatch函数仅在PHP >= 5.3 后才支持。