PHPは最近の他の言語とは違ってシングルスレッドなので、一回のリクエストで複数の処理を同時に実行したりといったことは通常はできません。
常に上から順に処理を進めていきます。
どうしてもやりたいなら`php hoge.php &`などと別プロセスで動かすといった手段しかありませんでした。
ところでなにやらpthreadsとかいうモジュールを見つけたので使ってみます。
LinuxであればPECLからインストールしましょう。
Windowsではバイナリが落ちてたので拾ってきます。
php_pthreads.dllをエクステンションのディレクトリに、pthreadVC2.dllは環境変数Pathが通っているところに置きます。
そしてphp.iniに以下を記述して再起動。
extension=php_pthreads.dll
これでpthreadsが使用可能になります。
phpinfo()にpthreadsという項目が追加されるのを確認しましょう。
それではさっそく実行。
TestThread::start()は、TestThread::run()を呼び出しますが、その処理の終了を待たずにすぐに次に進みます。
これでスレッド処理が簡単に行えます。
これで並列処理なんかも簡単に書けるようになりましたね。
まあスレッドが必要になるような処理をPHPで書くなよという話ではありますが。
常に上から順に処理を進めていきます。
どうしてもやりたいなら`php hoge.php &`などと別プロセスで動かすといった手段しかありませんでした。
ところでなにやらpthreadsとかいうモジュールを見つけたので使ってみます。
LinuxであればPECLからインストールしましょう。
Windowsではバイナリが落ちてたので拾ってきます。
php_pthreads.dllをエクステンションのディレクトリに、pthreadVC2.dllは環境変数Pathが通っているところに置きます。
そしてphp.iniに以下を記述して再起動。
extension=php_pthreads.dll
これでpthreadsが使用可能になります。
phpinfo()にpthreadsという項目が追加されるのを確認しましょう。
それではさっそく実行。
<?php class TestThread extends Thread{ /** * @Overide * startしたときに呼ばれる */ public function run(){ // 時間のかかる処理 sleep(10); // このスレッドのIDを確認 print($this->getThreadId()); // これを呼び出したスレッドのIDを確認 print($this->getCreatorId()); } } // TestThreadを別スレッドで起動 $testThread1 = new TestThread(); $testThread1->start(); $testThread2 = new TestThread(); $testThread2->start(); $testThread3 = new TestThread(); $testThread3->start(); $testThread4 = new TestThread(); $testThread4->start(); $testThread5 = new TestThread(); $testThread5->start();10秒かかる処理が5個あるということで一見50秒かかりそうですが、実際は10秒で処理が完了します。
TestThread::start()は、TestThread::run()を呼び出しますが、その処理の終了を待たずにすぐに次に進みます。
これでスレッド処理が簡単に行えます。
<?php class TestThread extends Thread{ public function run(){ sleep(10); } } // TestThreadを起動 $testThread = new TestThread(); $testThread->start(); // Thread::run()がまだ走っているか → true var_dump($testThread->isRunning()); // Thread::run()が終了するまで待機 $testThread->join(); // Thread::run()がまだ走っているか → false var_dump($testThread->isRunning());join()はスレッドが終了するまで待機してくれます。
これで並列処理なんかも簡単に書けるようになりましたね。
まあスレッドが必要になるような処理をPHPで書くなよという話ではありますが。
PR