web-dev-qa-db-ja.com

バックグラウンドスレッド/プロセスで関数を呼び出す(フォーク)

私はこのようなコードを持っています:

_($i=0; $i < 100; $i++)
{
   do ($foo[$i]);
}
_

上記は時間のかかる作業であり、関数を作成して、以下のように2回呼び出すことができることを望んでいました。

_function wrapper($start;$end)
{
    ($i=$start; $i < $end; $i++)
    {
       do ($foo[$i]);
    }
}
//have both of these run in parallel
wrapper(0,50);
wrapper(51,100);
_

Gearmanを見ましたが、gearmanサーバーをインストールできないため使用できません(共有サーバー上にあるため)。これを達成する方法は、フォークすることであるように思われます。私はそれについてたくさん読んでみましたが、ドキュメントとサポートは乏しいです。ヘルプ/ワイヤーフレームコードをいただければ幸いです。

私の質問を定義するために、子プロセスで実行されるように引数を渡してwrapper()を呼び出すにはどうすればよいですか。また、コールバック関数を登録できることも重要です。

追加の詳細:PHP 5.3、Linuxサーバーで実行。スクリプトはcgi-fcgiによって実行されます。

これが子プロセスを生成する方法だと思いますが、複数の子プロセスを生成するためにどのように使用できますか?また、コールバック関数を登録するにはどうすればよいですか?

_$pid = pcntl_fork(); 

if ( $pid == -1 ) {        
    // Fork failed            
    exit(1); 
} else if ( $pid ) { 
    // The parent process
    //should I repeat this same code here to spawn another child process?

} else { 
    // the child process 
    //can I call wrapper from here and will it run in this child process?
_
18
xbonez

「トゥドル・バーブのプロのブログ」より
http://blog.motane.lu/2009/01/02/multithreading-in-php/

require_once( 'Thread.php' );

// test to see if threading is available
if( ! Thread::isAvailable() ) {
    die( 'Threads not supported' );
}

// function to be ran on separate threads
function paralel( $_limit, $_name ) {
    for ( $index = 0; $index < $_limit; $index++ ) {
        echo 'Now running thread ' . $_name . PHP_EOL;
        sleep( 1 );
    }
}

// create 2 thread objects
$t1 = new Thread( 'paralel' );
$t2 = new Thread( 'paralel' );

// start them
$t1->start( 10, 't1' );
$t2->start( 10, 't2' );

// keep the program running until the threads finish
while( $t1->isAlive() && $t2->isAlive() ) {

}

Thread.phpをダウンロード

12
Beel

Linuxを使用している場合は、コマンドラインを利用して実行できます。

public function newWrapperInstance($start,$end){
    exec('bash -c "exec Nohup setsid php-cli yourFile.php '.$start.' '.$end.' > /dev/null 2>&1 &"');
}

これにより、バックグラウンドでPHPの新しいインスタンスが作成され、プライマリスレッドのexec関数から切り離されます。

警告:唯一の欠点は、一度作成されたスレッドの動作を制御できないことです。

3
0xen