pcntl介绍PHP的进程控制支持Unix风格的进程创建、程序执行、信号处理和进程中断。进程控制不能用在Web服务器环境中,在Web服务环境中使用时可能会产生意想不到的结果。本文档用于描述每个过程控制函数的一般用法。有关Unix进程控制的更多信息,建议您查阅有关fork(2)、waitpid(2)、signal(2)等的一些系统文档或更全面的参考资料,例如《Unix环境高级编程》(作者W.理查德史蒂文斯,艾迪生-卫斯理)。PCNTL现在使用ticks作为信号处理的回调机制,ticks在速度上远远超过了之前的处理机制。此更改遵循与“用户标记”相同的语义。您可以使用declare()语句指定程序中允许发生回调的位置。这最大限度地减少了异步事件处理的开销。在启用pcntl的情况下编译PHP总是会产生这种开销,无论您的脚本中是否实际使用了pcntl。一个调整是,对于PHP4.3.0之前的所有pcntl脚本,要使其工作,要么在(代码)部分使用declare()预计允许回调,要么使用declare()的新全局语法使它在整个脚本范围内。注意:此扩展在Windows平台上不可用。官方文档pcntl官方文档pcntl_fork#源码官方PHP4>=4.1.0,PHP5,PHP7)pcntl_fork—在当前进程的当前位置生成一个分支(子进程)。译注:fork创建子进程。父进程和子进程都从fork位置继续往下执行。不同的是父进程在执行过程中得到的fork返回值是子进程号,而子进程得到的是0。它的父进程只在它的PID(进程ID)和PPID(父进程ID)中存在。有关fork如何在您的系统上工作的详细信息,请参阅您系统的fork(2)手册。当返回值成功时,在父进程的执行线程中返回生成的子进程的PID,在子进程的执行线程中返回0。失败时,在父进程上下文中返回-1,不创建子进程,并引发PHP错误。代码0,如果fork成功,返回child进程id//父进程逻辑$time=microtime(true);echo"IamParentprocess:{$time}".NEWLINE;}else{//$pid=0//子进程逻辑$time=microtime(true);echo"我是子进程:{$time}".NEWLINE;}执行结果当前进程:17472我是父进程:1528697500.2961我是子进程:1528697500.2961fork后是子进程先执行还是父进程先执行先执行逻辑?测试代码这里我们交换了上面代码中父子进程的if顺序if($pid==-1){//创建错误,return-1die('processforkfailed');}elseif(!$pid){//$pid=0//子进程逻辑$time=microtime(true);echo"Iamasubprocess:{$time}".NEWLINE;}elseif($pid){//$pid>0,如果Fork成功,返回子进程id//父进程逻辑$time=microtime(true);echo"Iamtheparentprocess:{$time}".NEWLINE;}执行结果当前进程:17472我是父进程:1528697500.2961我是子进程:1528697500.2961测试总结fork会先执行父进程的逻辑,再执行子进程的逻辑
