亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

PHP執行大規模任務時如果提升效率?

PHP執行大規模任務時如果提升效率?

阿波羅的戰車 2018-06-10 09:39:41
我有一個php,每天計劃任務執行一次,邏輯如下:1.連接數據庫,從數據庫中Select讀取相關數據到數組2.根據得到的數據數量進行循環,循環中間包含3個mysql操作(select、insert、update各一個)3.循環完后關閉數據庫連接循環執行的次數根據步驟1的mysql_num_rows而定,基本上幾千上萬。那么在循環過程中就會短時間內連續執行幾千上萬X3次數據庫操作,效率非常低下。并且因為循環次數多任務重需要很長時間才能執行完,會導致nginx出現504錯誤。且頻繁數據庫操作和長連接,占用過多資源,導致整個環境效率低下。請問該怎么優化呢?麻煩各位大神賜教,先謝謝了
查看完整描述

5 回答

?
千巷貓影

TA貢獻1829條經驗 獲得超7個贊

就你說的這個情況,建議不要用請求的方式解決,用 crontab 加計劃任務在后臺運行 php 腳本,數據庫查詢時分批處理,比如總共 100000 條,每次 1000 條;如果必須逐條處理且速度不是很快,建議一邊 fetch_row 一邊處理,避免先放入 array 再循環。記得根據執行情況 set_time_limit 和數據庫連接的超時時間。

查看完整回答
反對 回復 2018-07-12
?
aluckdog

TA貢獻1847條經驗 獲得超7個贊

大量數據的時候交由任務系統去執行。首先發起一個請求,由消息生產者將請求交給消費者處理,并返回,避免等待出現超時。消費者執行多線程處理。建議使用Gearman,使用起來很方便,而且支持PHP接口。其它的類似Workman,Swoole等都能實現。


查看完整回答
反對 回復 2018-07-12
?
ITMISS

TA貢獻1871條經驗 獲得超8個贊

用cli模式的PHP腳本處理即可,不要使用WEB方式,很容易超時

查看完整回答
反對 回復 2018-07-12
?
一只名叫tom的貓

TA貢獻1906條經驗 獲得超3個贊

  1. 一次不要取太多的數據(減少資源占用)

  2. 采用多進程的方式,并行執行(提高效率)

  3. 適當的使用 sleep


查看完整回答
反對 回復 2018-07-12
?
慕田峪9158850

TA貢獻1794條經驗 獲得超7個贊

  • 對性能要求不高,數據量也不高(10W內都還好),可以直接定時任務(cli模式)。

  • 對性能要求稍高或數據量較大,可以用定時任務+隊列(參考數據:20W數據,每次約5條sql;隊列78個進程,約20秒處理完)


查看完整回答
反對 回復 2018-07-12
  • 5 回答
  • 0 關注
  • 267 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號