2016-02-20 103 views
1

我有一個Web應用程序,用戶可以上傳文本文件。應用程序讀取文本文件並根據文件數據執行30個不同的任務,並在幾秒鐘後向用戶顯示輸出。設計PHP程序體系結構

我的方法是編寫一個php程序,它將接受文本文件,然後調用不同的腳本(php和unix腳本)來執行30個不同的任務。

我有兩個疑問:

  1. 我可以並行運行,以節省總執行時間30個不同的腳本?如果是的話,我應該在php中使用pthread庫進行多線程?我讀過一篇文章,指出多線程無助於Web應用程序節省執行時間。文章說,儘管所有的線程都可以並行運行,但是它們將需要相同的時間,就像它們按順序運行一樣。

  2. 我怎麼知道所有的線程是否結束?如果我繼續檢查所有線程的執行情況,是不是會對系統資源造成負擔?

回答

0

使用多個線程可以潛在地提高你的整體執行時間的速度,但它也可以潛在地使你想實現更加複雜的東西,所以一般應避免,除非速度的改進是真的值得你。另外,如果有人在加載網頁時觸發(如我懷疑的那樣),那麼使用線程幾乎肯定是一個糟糕的計劃。這更詳細地討論here。如果它被命令行觸發,例如:

php processTextFile.php

然後,它可能是一些可能對你有益。

至於在這個特定的情況下,它會加快你的處理,這將取決於你在做什麼。

從你如何你一句話的問題,你可以嘗試做兩件事情:

  1. 運行任務的一個文本文件管道。在這種情況下,運行第一個任務後收到的數據將與初始數據不同,然後您將通過第二個任務運行這些新數據。 (例如,也許你有一個JSON編碼對象,第一個任務是將它解碼成一個數組)。如果你這樣做,那麼多線程將不會幫助你,因爲每個線程都需要你初始化線程時需要使用的數據。

  2. 在原始文件中執行所有單獨的任務,然後返回處理後的數據以返回您的結果。在這種情況下,多線程將起作用。

如果多線程仍然有效爲您的使用情況下,則:

  • 您可以同時運行30個腳本。你會發現只有在你有多個處理器或多個核心的盒子上纔會有性能提升,因爲它可以讓電腦同時使用兩者
  • 你可以使用pthread來達到這個目的(95%肯定,this thread支持這種看法)
  • 工作如何實際使用它,你可能想看看在實施GitHub的項目的例子
0

一些人,當遇到一個問題,想:「我知道,我會使用線程,「然後他們有兩個具有錯誤。

與其試圖並行化這30個腳本,我反而會建議專注於提高性能。當然,這取決於您嘗試執行的具體任務以及這些上傳文件的大小。

阻塞點之一通常是變頻器的I/O。所以,如果你能找到一個合理的方式來使用ramFS的緩存(用於php腳本)(對於php和shell腳本),它可能會提高執行這些任務的速度。

這就是說,實際上不知道具體情況,真的很難給出任何非模糊的建議:(