php多进程-注意事项

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/raoxiaoya/article/details/100555418

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);

猜你喜欢

转载自blog.csdn.net/raoxiaoya/article/details/100555418