iT邦幫忙

0

php 多執行緒問題

pierre777 5 月前5466 瀏覽

各位大大,
因為最近跑公司月報表計算要跑10小時才跑得出來...
看完了程式,sql方面感覺沒有什麼太大問題,雖然有些東西可以做索引
但事發現最嚴重的問題是,linux的cpu有給8顆,php在跑的時後永遠只讓1顆cpu滿載,其他cpu都沒有動作....請問php有什麼方法可以讓程式多執行緒嗎><

wonton iT邦高手 6 級 ‧ 5 月前 檢舉
純建議,有時候索引,sql語句的寫法都會影響效能,我曾經簡單的把where子句中的內建函數取消,查詢速度從半小時拉回不到一分鐘,所以不可大意。
fillano iT邦超人 1 級 ‧ 5 月前 檢舉
問題恐怕不是多執行緒就能解決,而且...如果運算的重心在sql伺服器,那瓶頸也不會在php這裡,即使多執行緒也沒用。

另外,真要用多個行程來跑,你程式也要改寫...改用map/reduce的方式來處理資料。
海綿寶寶 iT邦超人 1 級 ‧ 5 月前 檢舉
8顆cpu....樓主一定沒看過這影片
https://youtu.be/MNhubpzhs-Q
1
raytracy
iT邦大神 1 級 ‧ 5 月前

PHP 不支援多執行緒, 只能靠你自己改寫程式來達到 Multiple-Processor 的分散式運算:

https://www.google.com.tw/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=php+multi+process&*

1
weiclin
iT邦高手 7 級 ‧ 5 月前

php 有 pthreads, 是要另外安裝的 extension
注意這不能用在網頁跑, 只能用在終端機執行:
http://php.net/manual/en/book.pthreads.php

另外, php 的多執行緒運作方式也跟其他語言不相同
如果你曾經用其他語言寫過 multi thread, 請先看一下這篇做好心理準備:
http://stackoverflow.com/questions/14564234/pthread-thread-objects-reset-their-state

可以的話, 建議你把這裡給的範例都仔細研究過才使用:
https://github.com/krakjoe/pthreads/tree/master/examples

還有這一篇講到了一些基本概念, 也推薦讀一讀
https://gist.github.com/krakjoe/6437782

2
bizpro
iT邦大師 1 級 ‧ 5 月前

php在跑的時後永遠只讓1顆cpu滿載,其他cpu都沒有動作....請問php有什麼方法可以讓程式多執行緒嗎

多執行緒(multiple threads)和多核多工(multitasking on multiple cores)的並發(concurrent)運算是不同的. 單一核心本就可以運行多執行緒, 當您的報表只有一隻程序(process), 即使PHP透過拓展或程式設計以"異步"的方式"虛擬"多執行緒, 作業系統分支(fork)出來的還是在同一顆核心上, 不斷在執行緒之間切換, 並無法並發(concurrent)執行, 即使您修改了程式來做多執行緒, 請注意:

  1. PHP的多執行緒安全/線程安全(thread-safe): 如果您不是將多執行緒安全/線程安全(thread-safe)加入PHP組態自行編譯PHP, 您必須下載線程安全的PHP版本.
  2. PHP版本: 建議您使用PHP 7.0及以上.
  3. 資料結構, 資料處理, 商業邏輯, 與演算法: 您必須確保多執行緒與並發的運行產生的結果和單執行緒運行的結果是一致的.

多執行緒和並發運算並不保證效能的提昇, 有可能會降低效能和產生更多的問題, 透過改變資料結構, 商業邏輯, 和演算法, 可能會產生更好的結果. 原則上, 保持單一PHP腳本單執行緒是較好的策略, 然後透過PHP-FPM來進行多執行緒並發運行, 例如用Nginx透過FastCGI將PHP解譯交給PHP-FPM來執行. 當然, 前提是您的資料結構, 資料處理, 商業邏輯, 與演算法必須能在多執行緒並發的環境中正確運作.

關於單一CPU/core滿載, 您可以用htop檢查. 而htop可以看到那一個CPU執行哪些程序與執行緒.

我要發表回答

立即登入回答