台灣最大程式設計社群網站
線上人數
1566
 
會員總數:245912
討論主題:189503
歡迎您免費加入會員
討論區列表 >> PHP >> 如何防止無限迴圈的php CPU承載過重?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
如何防止無限迴圈的php CPU承載過重?
價值 : 50 QP  點閱數:1079 回應數:3
樓主

阿醜
初學者
15 120
1250 174
發送站內信

我寫了一隻程式,專門在抓某個api 的所提供的數據。然而,為了防止每次insert新資料料後,就必被把舊的資料狀態改掉。(不能一直用insert,因為有可能這次這個id進來的資料有四個,下一次有三筆,再下一次可能有五筆),所以我用了幾個陣列來紀錄,比對,一但資料有不同的時候能寫才資料庫。

例如:


程式大約是這樣的狀況,但是約執行一天,主機的cpu 就會承載至100% , 且這樣的程式,我約有四至五個線程要跑.....
這樣的思考方式是正確的嗎?或者有什麼更有效率的執行方式?

p.s. sqlinsert 裡的func 主要是 「更改上一筆資料的狀態,再 insert一筆新的」。資料更新的時間約2秒 至 10分鐘 不等, 經查並不是sql 的問題,而是php本身的承載就過重了

搜尋相關Tags的文章: [ php ] , [ cpu承載 ] ,
本篇文章發表於2014-10-23 13:35
1樓
作者回應

阿醜
檢舉此回應
補充:

每支程式約用四個arrays 三維陣列來作「紀錄」的動作,id可能會有0-15個
第一、二大類的數據約有1-10組的小數據。
本篇文章回覆於2014-10-23 13:37
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
回應

香帥
檢舉此回應
..可能這次這個id進來的資料有四個,下一次有三筆...
就每次比對進來的資料就好,不應該用迴圈去比對所有資料
請參考
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20130405135004LYH&fumcde=BRD20130405135004LYH
第57行以下
findit函數
類似那樣每次比較進來資料,沒有找到或找到但資料不同才去insert或update
不宜將所有資料用迴圈一直去比較(假設您的資料數十萬筆以上,更應作索引去比較),這樣很沒有效率或者拖累整個系統,
本篇文章回覆於2014-10-28 01:36
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
一般來說,會發生這樣的情況,有很大的可能性是你這支的php並未釋放掉。
或是程式內過渡運行該php程式。

由於你使用了do及foreach雙重廻圈。這樣的寫法非常不好。很容易發生無限廻圈或是拖慢增加php負載。

依照你的說明,你這是獲取他方記錄的情況下。一方面來說,如真有必要。我大多會用排程的方式處理
並且會在while的條件內,多加一個運行時間的判斷。也就是do廻圈不管跑多久。只要大於運行一段秒數之後,就會中斷該程式運行。

這是比較安全的寫法。
本篇文章回覆於2014-10-28 07:17
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.