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实现检测注册的旌旗灯号 RESTful API

<?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 后才支持。