phpで子プロセスをforkしてもmysqlのコネクションは持ち回る

phpの処理の途中にsleepを入れるとコネクションが切れる?

と思ったけどさすがにそんなことはなくて、子プロセスを作らなければうまくいく。

このコードが通らない原因は、親プロセスの方が先に寿命がきて、mysqlのコネクション、ファイルデスクリプタがなくなっちゃうのが原因。

どうやらmysqlのコネクションはすべてのプロセスで同じようにもちつつ、親、子ともにどちらか先に死んだ時にクローズされるらしい。かといってさくさくっと子プロセス用のコネクションを張ってやることもできないが、なんとしても新しくコネクションを張って渡してやることが重要。

<?php

$arr = array
(1, 2, 4, 8);

$pdo = new PDO("mysql:host=db.l2tp.org; dbname=wordpress",
"yousan", "");

foreach($arr as $val){
global $sum, $g;
$g = $val;
$i++;
$pid = pcntl_fork();
if($pid === 0){
sleep(1);
$stmt = $pdo->query("select * from wp_posts limit 2;");
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
var_dump($row);
}
myfunc();
$sum += $val;
exit;
//var_dump('child'.$sum);
}else{
var_dump('sum:'.$sum.', i:'.$i);
$g--;
}
}

function myfunc(){
global $g;
var_dump($g);
}

%php pcntl_test.php
string(9) “sum:, i:1”
string(9) “sum:, i:2”
string(9) “sum:, i:3”
string(9) “sum:, i:4”
%

%PHP Fatal error:  Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 17

Fatal error: Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 17
PHP Fatal error:  Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 17

Fatal error: Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 17
PHP Fatal error:  Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 17
PHP Fatal error:  Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 17

Fatal error: Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 17

Fatal error: Call to a member function fetch() on a non-object in /usr/home/yousan/phptest/pcntl_test.php on line 1

コメントを残す