忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/17 14:50 |
PHP5.4.7 PHPでスレッド
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


2013/06/03 23:48 | Comments(0) | PHP

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<AuraPHP 1.0.0 Aura.Router その2 | HOME | 買ったものリスト 2013/06/02>>
忍者ブログ[PR]