我在我的PHP服務器端API的一個地方,我正在做大量的MySQL查詢,我想通過多線程處理不同的查詢來加速它,然後返回結果。併發在PHP中
但是我如何在PHP中創建另一個線程?我傳遞POST PARAMS,所以一個簡單的shell_exec()
可以工作,但似乎有點不安全。選項我考慮:
1)用我的參數做一個捲曲的請求,過程從請求的JSON,然後返回
2)呼叫shell_exec()
用PHP CLI並以某種方式(我會怎麼做這??)處理的反應在PHP
什麼是最好的選擇在這裏?
我在我的PHP服務器端API的一個地方,我正在做大量的MySQL查詢,我想通過多線程處理不同的查詢來加速它,然後返回結果。併發在PHP中
但是我如何在PHP中創建另一個線程?我傳遞POST PARAMS,所以一個簡單的shell_exec()
可以工作,但似乎有點不安全。選項我考慮:
1)用我的參數做一個捲曲的請求,過程從請求的JSON,然後返回
2)呼叫shell_exec()
用PHP CLI並以某種方式(我會怎麼做這??)處理的反應在PHP
什麼是最好的選擇在這裏?
PHP中沒有線程支持。但是,您可以使用pcntl
擴展名來生成和管理分叉,但如果您得出應該使用線程完成的結論,最好再次查看算法。
異步處理長時間運行操作的選項是將它們存儲在數據庫中,並讓後臺工作進程從數據庫中取出它們,計算結果,然後將結果存儲在數據庫中。然後前面的腳本會在數據庫中查看它們,看它們是否完成,結果如何。
如果是這種情況,大型網站如何在PHP中構建? – lollercoaster 2012-04-26 02:23:31
@lollercoaster:如何「大規模」與線程相關? – zerkms 2012-04-26 02:23:59
在我看來,具有許多數據庫交互的性能關鍵的API /站點需要併發性 – lollercoaster 2012-04-26 02:25:33
查看pcntl extension。 PHP根本不支持真正的線程,所以你必須通過fork()來實現僞線程。請注意fork()過程比產生一個線程「重」得多。
PHP沒有實現線程(並且可能永遠不會),因爲許多PHP的庫不是線程安全的。該替代方案是pcntl
,其包裝了C fork
函數。
我對created a handy wrapper這些功能,讓我管理他們在更高的水平。
$thread1 = new Thread(function($thread) {
sleep(4);
$thread->write("Hello\n");
});
$thread2 = new Thread(function($thread) {
sleep(5);
$thread->write("World\n");
});
$thread3 = new Thread(function($thread) {
sleep(6);
});
print $thread1->read(); // time: 0 -> 4
print $thread2->read(); // time: 4 -> 5
$thread3->join(); // time 5 -> 6
// More advanced handling:
// Thread::selectUntilJoin(array($thread1, $thread2, $thread3), function() { ... }, function() { ... });
「意思是不能從不同線程調用函數」---這是不正確的TS代碼定義 – zerkms 2012-04-26 03:24:25
通常它是由隊列和工作者完成的,它監視它 – zerkms 2012-04-26 02:22:49
這是如何完成的? – lollercoaster 2012-04-26 02:23:42
你設置了一些隊列管理軟件(即rabbitmq)。然後您的腳本將任務添加到隊列中,並且一些後臺工作人員執行它。 – zerkms 2012-04-26 02:25:02