版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
php多进程-注意事项
1、子进程中的输出会由父进程输出来。
2、pcntl_wait() 和 pcntl_waitpid() 函数调用的是操作系统的wait方法,是一种阻塞操作。
3、父进程一定要等待子进程退出后才退出。
4、如果有多个子进程,则需要while循环来wait,因为只要有一个子进程退出了就会触发pcntl_wait执行。
5、子进程可以通过继承上下文的方式继承父进程的连接句柄,来做一些操作,同时子进程和父进程都可以释放
或者销毁这个连接。而且,父/子进程一旦退出默认就会释放全部的句柄。
<?php
$mysqli = new mysqli('127.0.0.1', 'root', 'Rxy123**', 'data', 3306);
if($mysqli->connect_error){
die('Connect Error (' . $mysqli->connect_errno . ') ' . $mysqli->connect_error);
}
$pid = pcntl_fork();
if($pid == -1){
echo 'fork error'.PHP_EOL;
}elseif($pid){
echo 'this is father '.posix_getpid().PHP_EOL;
}else{
$re = $mysqli->query("insert into member(name,age,time) values('ddd', 23, ".time().")");
var_dump($re);// 打印在父进程
sleep(3);// 核实 pcntl_wait 是否会阻塞
echo 'this is son '.posix_getpid().PHP_EOL;
}
// 阻塞
$nPID = pcntl_wait($nStatus);
if ($nPID > 0) {
echo "{$nPID} exit\n";
}
// $mysqli 已经被子进程释放了,所以这里会报错 MySQL server has gone away
$ret = $mysqli->query('select * from member');
var_dump($ret);