2

私のmysqlデータベース内のアイテムのキューを処理するcakephpのシェルスクリプトに取り組んでいます。プロセスを高速化するために、次のように pcntlfork を使用しています。

$pids = array();
$i = 0;
for($i = 0; $i < count($queue); $i++) 
{

     $pids[$i] = pcntl_fork();

      if(!$pids[$i]) {
        # do code
        exit();
      } 
    }

このコードの実行中に、現在のスクリプトがキューから項目を削除する前に、シェル スクリプトが実行される場合があります。私はmysqlを使用していて、次のようにテーブルをロックしていました:

$this->Queue->query("SELECT GET_LOCK('".$this->mysqlLock."', ".$this->mysqlLockTime.") AS 'GetLock'");

この実装は機能せず、「一般的なエラー: mysql サーバーがなくなりました」というエラーが表示されます。これは、子供たちのつながりが失われているためです。PHP の fork 自体に欠陥があるようです。

私の質問は、このプロセスが終了するまでロックし、他のシェルスクリプトが実行できるように解放するためのより良い解決策はありますか?

4

1 に答える 1

1

プログラムがそれ自体のインスタンスを呼び出して実行しないことを保証するための最良の解決策を見つけました。プログラムをロックするためにphpでセマフォを使用します。

セマフォに関する短いチュートリアルは次のとおりです: http://www.re-cycledair.com/php-dark-arts-semaphores

于 2012-10-05T15:53:38.150 に答える