2012-04-26 54 views
9

我在我的PHP服務器端API的一個地方,我正在做大量的MySQL查詢,我想通過多線程處理不同的查詢來加速它,然後返回結果。併發在PHP中

但是我如何在PHP中創建另一個線程?我傳遞POST PARAMS,所以一個簡單的shell_exec()可以工作,但似乎有點不安全。選項我考慮:

1)用我的參數做一個捲曲的請求,過程從請求的JSON,然後返回

2)呼叫shell_exec()用PHP CLI並以某種方式(我會怎麼做這??)處理的反應在PHP

什麼是最好的選擇在這裏?

+0

通常它是由隊列和工作者完成的,它監視它 – zerkms 2012-04-26 02:22:49

+0

這是如何完成的? – lollercoaster 2012-04-26 02:23:42

+0

你設置了一些隊列管理軟件(即rabbitmq)。然後您的腳本將任務添加到隊列中,並且一些後臺工作人員執行它。 – zerkms 2012-04-26 02:25:02

回答

4

PHP中沒有線程支持。但是,您可以使用pcntl擴展名來生成和管理分叉,但如果您得出應該使用線程完成的結論,最好再次查看算法。

異步處理長時間運行操作的選項是將它們存儲在數據庫中,並讓後臺工作進程從數據庫中取出它們,計算結果,然後將結果存儲在數據庫中。然後前面的腳本會在數據庫中查看它們,看它們是否完成,結果如何。

+1

如果是這種情況,大型網站如何在PHP中構建? – lollercoaster 2012-04-26 02:23:31

+1

@lollercoaster:如何「大規模」與線程相關? – zerkms 2012-04-26 02:23:59

+1

在我看來,具有許多數據庫交互的性能關鍵的API /站點需要併發性 – lollercoaster 2012-04-26 02:25:33

3

查看pcntl extension。 PHP根本不支持真正的線程,所以你必須通過fork()來實現僞線程。請注意fork()過程比產生一個線程「重」得多。

2

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() { ... }); 
+0

「意思是不能從不同線程調用函數」---這是不正確的TS代碼定義 – zerkms 2012-04-26 03:24:25