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() 注册的函数。
<?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 后才支持。