各位大大,
因為最近跑公司月報表計算要跑10小時才跑得出來...
看完了程式,sql方面感覺沒有什麼太大問題,雖然有些東西可以做索引
但事發現最嚴重的問題是,linux的cpu有給8顆,php在跑的時後永遠只讓1顆cpu滿載,其他cpu都沒有動作....請問php有什麼方法可以讓程式多執行緒嗎><
PHP 不支援多執行緒, 只能靠你自己改寫程式來達到 Multiple-Processor 的分散式運算:
https://www.google.com.tw/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=php+multi+process&*
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
php在跑的時後永遠只讓1顆cpu滿載,其他cpu都沒有動作....請問php有什麼方法可以讓程式多執行緒嗎
多執行緒(multiple threads)和多核多工(multitasking on multiple cores)的並發(concurrent)運算是不同的. 單一核心本就可以運行多執行緒, 當您的報表只有一隻程序(process), 即使PHP透過拓展或程式設計以"異步"的方式"虛擬"多執行緒, 作業系統分支(fork)出來的還是在同一顆核心上, 不斷在執行緒之間切換, 並無法並發(concurrent)執行, 即使您修改了程式來做多執行緒, 請注意:
多執行緒和並發運算並不保證效能的提昇, 有可能會降低效能和產生更多的問題, 透過改變資料結構, 商業邏輯, 和演算法, 可能會產生更好的結果. 原則上, 保持單一PHP腳本單執行緒是較好的策略, 然後透過PHP-FPM來進行多執行緒並發運行, 例如用Nginx透過FastCGI將PHP解譯交給PHP-FPM來執行. 當然, 前提是您的資料結構, 資料處理, 商業邏輯, 與演算法必須能在多執行緒並發的環境中正確運作.
關於單一CPU/core滿載, 您可以用htop檢查. 而htop可以看到那一個CPU執行哪些程序與執行緒.