[摘要]本篇文章给大家带来的内容是关于php如何处理进程信号(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。php有一组进程控制函数PCNTL,使得php能在*nix系统中实现跟c...
本篇文章给大家带来的内容是关于php如何处理进程信号(附实例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。php有一组进程控制函数PCNTL,使得php能在*nix系统中实现跟c一样的创建子进程、使用exec函数执行程序、处理信号等功能。
注意:pcntl这个扩展仅在cli/cgi模式下可用。mod_php和php-fpm中不可以使用。在web server环境中不要使用这组函数,因为会导致不可预料的结果。另,windows作为非类unix系统,没有这些函数。
PCNTL 使用ticks来作为信号处理机制(signal handle callback mechanism),可以最小程度地降低处理异步事件时的负载。何谓ticks?Tick 是一个在代码段中解释器每执行 N 条低级语句就会发生的事件,这个代码段需要通过declare来指定。
下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
<?php
declare(ticks = 1);
function signal_handler($signal) {
print "Caught SIGALRM/n";
pcntl_alarm(5);
}
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(5);
while(true){
}
?>
<?php
// 定义一个处理器,接收到SIGINT信号后只输出一行信息
function signalHandler($signo) {
switch ($signo) {
case SIGUSR1: echo "SIGUSR1\n"; break;
case SIGUSR2: echo "SIGUSR2\n"; break;
default: echo "unknow"; break;
}
}
//安装信号触发器器
pcntl_signal(SIGINT, 'signalHandler');
while (true) {
sleep(1);
posix_kill(posix_getpid(), SIGUSR1);///向当前进程发送SIGUSR1信号
pcntl_signal_dispatch(); //接收到信号时,调用注册的signalHandler()
}PCNTL的函数:
信号处理
int pcntl_alarm ( int $seconds )设置一个$seconds秒后发送SIGALRM信号的计数器
bool pcntl_signal(int $signo ,callback $handler [,bool $restart_syscalls=true])为$signo设置一个处理该信号的回调函数
第一个参数是信号编号 第二个参数是信号发生时回调的PHP函数。 第三个参数是是否restart,是否重新注册此信号。这个参数如果为false,那此信号只注册处理一次。
注意:每次对 pcntl_alarm()的调用都会取消之前设置的alarm信号和sleep()函数。
下面是一个隔5秒发送一个SIGALRM信号,并由signal_handler函数获取,然后打印一个“Caught SIGALRM”的例子:
<?php
declare(ticks = 1);
function signal_handler($signal) {
print "Caught SIGALRM/n";
pcntl_alarm(5);
}
pcntl_signal(SIGALRM, "signal_handler", true);
pcntl_alarm(5);
for(;;) {
}
?>执行程序
void pcntl_exec ( string $path [, array $args [, array $envs ]] )在当前的进程空间中执行指定程序,类似于c中的exec族函数。所谓当前空间,即载入指定程序的代码覆盖掉当前进程的空间,执行完该程序进程即结束。
<?php
$dir = '/home/test/';
$cmd = 'ls';
$option = '-l';
$pathtobin = '/bin/ls';
$arg = array($cmd, $option, $dir);
pcntl_exec($pathtobin, $arg);
echo '123'; //不会执行到该行
?>创建进程
int pcntl_fork ( void ) 为当前进程创建一个子进程
int pcntl_wait ( int &$status [, int $options ] ) 阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。
int pcntl_waitpid ( int $pid , int &$status [, int $options ] ) 功能同pcntl_wait,区别为waitpid为等待指定pid的子进程。当pid为-1时pcntl_waitpid与pcntl_wait一样。在 pcntl_wait和pcntl_waitpid两个函数中的$status中存了子进程的状态信息,这个参数可以用于 pcntl_wifexited、pcntl_wifstopped、pcntl_wifsignaled、pcntl_wexitstatus、 pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid这些函数。
举个例子
<?php
$pid = pcntl_fork();
if($pid) {
pcntl_wait($status);
$id = getmypid();
echo "parent process,pid {$id}, child pid {$pid}/n";
} else {
$id = getmypid();
echo "child process,pid {$id}/n";
sleep(2);
}
?>子进程在输出child process等字样之后sleep了2秒才结束,而父进程阻塞着直到子进程退出之后才继续运行。
进程优先级
int pcntl_getpriority ([ int $pid [, int $process_identifier ]] ) 取得进程的优先级,即nice值,默认为0。不同的系统类型以及内核版本下 优先级可能不同(手册中为-20到20)
bool pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] ) 设置进程的优先级以上就是php如何处理进程信号(附实例)的详细内容,更多请关注php中文网其它相关文章!
微信
分享
网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。
关键词:php如何处理进程信号(附案例)