搜索
写经验 领红包

php实现检测注册的信号是什么(php注册验证)

导语:PHP实现检测注册的信号

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

本文内容由小涵整理编辑!