免責事項:この記事はブロガーオリジナル記事です、続くBY-SAのCC 4.0を著作権契約、複製、元のソースのリンクと、この文を添付してください。
PHP複数のプロセス - ノート
1、子プロセスの出力は、親プロセスによって出力されます。
2、pcntl_wait()とpcntl_waitpid()関数呼び出し待ち方法オペレーティングシステムは、ブロッキング操作です。
3、親プロセスが終了する前に、子供を待つ必要があります。
限り、子プロセスがあるとして、トリガーpcntl_wait実行を終了したために4は、複数の子ならば、あなたは、待つwhileループが必要になります。
子供と親が解放することができながら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);