PHP进程信号处理,PHP信号处理机制的操作代码讲

作者们先是来看下实例代码:

PHP进程功率信号管理

  php有大器晚成组经过调控函数PCNTL,使得php能在*nix系统中完毕跟c同样的创制子进度、使用exec函数施行顺序、管理功率信号等成效。

瞩目:pcntl这几个扩充仅在cli/cgi形式下可用。mod_php和php-fpm中不得以应用。在web server景况中永不使用那组函数,因为会产生不可预期的结果。另,windows作为非类unix系统,未有这一个函数。

function sig_handler{ print("handled sig: $sign");} pcntl_signal;posix_kill; while{ posix_kill; pcntl_signal_dispatch;}

ticks

  PCNTL 使用ticks来作为时限信号管理体制(signal handle callback mechanism),能够十分的小程度地回退处理异步事件时的载重。何谓ticks?Tick 是一个在代码段中解释器每实践 N 条低等语句就能够时有发生的平地风波,这一个代码段需求经过declare来钦命。

下边是二个隔5秒发送二个SIGALRM时限信号,并由signal_handler函数获取,然后打印一个“SIGALRM”的例证:

<?php           declare(ticks = 1);                 function signal_handler($signal) {               echo "SIGALRM".date("Y-m-d H:i:s",time.PHP_EOL;             pcntl_alarm(5);           }                 //安装闹钟信号触发器        pcntl_signal(SIGALRM, "signal_handler", true);           pcntl_alarm;   //5秒后向进程发送一个SIGALRM信号              while(true){        }          ?>

  其实官方的pcntl_signal品质极差,首借使PHP的函数无法直接登记到操作系统实信号设置中,所以pcntl时限信号需求信赖tick机制来完成。 pcntl_signal的落到实处原理是,触发时限信号后先将时限信号加入一个队列中。然后在PHP的ticks回调函数中不断检查是或不是有信号,假诺有功率信号就施行PHP中钦定的回调函数,若无则跳出函数。 ticks=1代表每实施1行PHP代码就回调此函数。实际上多数时间都不曾时域信号发生,但ticks的函数平昔会施行。 相比较好的做法是去掉ticks,转而接纳pcntl_signal_dispatch,在代码循环中自行管理能量信号。

最佳本人手动循环管理数字信号队列,并非使用php提供的的declare,tick_handler(卡塔尔国这种能量信号管理机制,因为tick机制的个性难题,每实行一条语句都回调tick_handler查看是不是有时域信号,而很一大半时刻是从未有过功率信号的。

pcntl_signal_dispatch

隔5秒发送四个SIGALRM时域信号

<?php    function signalHandler($signo) {        switch ($signo) {            case SIGUSR1: echo "SIGUSR1".date("Y-m-d H:i:s",time.PHP_EOL; break;            case SIGALRM: echo "SIGALRM".date("Y-m-d H:i:s",time.PHP_EOL; break;            default:      echo "unknow" .date("Y-m-d H:i:s",time.PHP_EOL; break;        }        pcntl_alarm(5);    }    //安装信号触发器器    pcntl_signal(SIGALRM, 'signalHandler', true);    pcntl_alarm; // 5秒后向进程发送一个SIGALRM信号    while (true) {        sleep;   //为了避免调用dispatch太频繁,每5秒派发一次信号        pcntl_signal_dispatch(); //接收到信号时,调用注册的signalHandler()    }?>

或者

每5秒发送叁个自定义实信号

<?php    function signalHandler($signo) {        switch ($signo) {            case SIGUSR1: echo "SIGUSR1".date("Y-m-d H:i:s",time.PHP_EOL; break;            default:      echo "unknow" .date("Y-m-d H:i:s",time.PHP_EOL; break;        }    }    //安装信号触发器器    pcntl_signal(SIGUSR1, 'signalHandler');    while (true) {        sleep(5);        posix_kill(posix_getpid(), SIGUSR1);///向当前进程发送SIGUSR1信号        pcntl_signal_dispatch(); //接收到信号时,调用注册的signalHandler()    }?>

posix_signal设置时限信号的回调解和管理理,

PCNTL的函数:

posix_kill仅仅是把复信号归入进度的信号待管理队列中,全数并不会触发时域信号回调,由pcntl_signal_dispatch管理频限信号队列中的时限信号

实信号处理

int pcntl_alarm ( int $seconds )

安装一个$seconds秒后发送SIGALRM复信号的流量计

bool pcntl_signal(int $signo ,callback $handler [,bool $restart_syscalls=true])

为$signo设置叁个甩卖该非功率信号的回调函数

率先个参数是时限信号编号 第2个参数是频限信号产生时回调的PHP函数。 第八个参数是是不是restart,是不是再一次注册此确定性信号。那些参数假使为false,那此信号只登记管理一遍。

注意:每次对 pcntl_alarm()的调用都会废除以前设置的alarm时限信号和sleep(卡塔尔(英语:State of Qatar)函数。

上面是二个隔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 {           }             ?>

posix_getpwnam:获取客商名的uid,gid等音信

实行顺序

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';    //不会执行到该行       ?>

pcntl_signal(SIGPIPE, SIG_IGN, false卡塔尔国:忽视内核发来的SIGPIPE信号,当连接已closed,进度继续发多少到不行socket,系统会接到含奇骏ST 调控位TCP包,系统会产生三个SIGPIPE实信号给进度,告诉进度这一个延续已经断开了,不要再写了。该时域信号的暗中同意管理是停止进度,进度能够捕获它并忽视该时限信号以防不情愿的被停止。

始建进度

int pcntl_fork  为当前进程创建一个子进程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秒才截至,而父进度窒碍着直到子进程退出之后才继续运维。

socket上下文选项:

进程优先级

int pcntl_getpriority ([ int $pid [, int $process_identifier ]] ) 取得进程的优先级,即nice值,默认为0。不同的系统类型以及内核版本下 优先级可能不同(手册中为-20到20)bool pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] ) 设置进程的优先级

仿照效法资料:

PHP进度时限信号处理

pcntl_alarm按期石英钟时限信号详细解释

backlog:用于限定流监听队列中未成功连接的连续几天数量

so_reuseport:重用端口(由底蕴调治连接到多少个监听同二个端口的长河,由于是透过hash形式来注脚连接对应的进程,所以监听进度数是不可能退换的,)

电火花计时器确定性信号管理

pcntl_signal(SIGALRM,"sig_handler");pcntl_alarm;function sig_handler{ echo "one second after";}while { pcntl_signal_dispatch;}

本文由365bet体育在线官网发布于网络编程,转载请注明出处:PHP进程信号处理,PHP信号处理机制的操作代码讲

TAG标签:
Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。