2011-07-26 40 views
1

親pidにある配列要素を変更できるようにします。ここではいくつかのサンプルコードは、次のとおりです。このスクリプトが終了するときPHP pcntl変数の範囲

$arrayContainer = array(
    array(
      "id" => 1, 
      "name" => "Lenny" 
    ), 
    array(
      "id" => 2, 
      "name" => "Dudley" 
    ), 
    array(
      "id" => 3, 
      "name" => "Simon" 
    ), 
); 

foreach ($arrayContainer as $key => $element) { 
    $pid = pcntl_fork(); 
    if($pid == -1) { 
     // Something went wrong (handle errors here) 
     die("Could not fork!"); 
    } elseif($pid == 0) { 
     $arrayContainer[$key]['size'] = 123; 
     $arrayContainer[$key]['fileName'] = 'somefile.txt'; 
     // The child dies after a short while, becoming a zombie 
     exit(); 
    } else { 
     // This part is only executed in the parent 
    } 
} 

は、だから私は子プロセスに書いた2つの要素は、foreachループの終わりでありません。私は子から親pidにある配列を変更することはできません。私は理由を理解していますが、私に可能な素晴らしい解決策は考えられません。あなたは何かを提案できますか?グローバルか何か?

答えて

2

親子プロセスは、同じstdin/stdoutを共有します。 PARENTプロセスが各fork()コールの前にstdin/stdoutを再マップすると、各子に専用のstdin/stdoutsを持つことができます。これにより、各自のコミュニケーションチャネルを使用して各子供に話すことができ、また各子供を個別に聞くことができます。

次に、単純な通信プロトコルを使用して、子供が変更されたデータを親に戻すことができるようにするだけの簡単なことです。

+0

うん、memcachedだ。 – gprime

+1

@Marc B.ここに簡単な例を載せてもらえますか?興味ある! – Cesar

3

あなたは、共有メモリを使用してみてください。http://www.php.net/manual/en/ref.shmop.php

必要に応じて、共有メモリのためのよく知られた名前は、親と子供に)(あなたはshmop_openできるようになるました。この共有メモリを保護するためにセマフォを使用して、2つの書き込みが同時に発生しないように注意してください。つまり、共有メモリ上に相互排他ロックを持つ。

+0

ええ、私は実際にmemcachedを使用して現在リファクタリングしています。私の論理をたくさん変えなければならないが、結果は良いものになるだろう。 – gprime