系統跑一個長時間啟動並執行守護進程指令碼,每分鐘掃描一次redis隊列,滿足條件時進入邏輯處理,但每過兩到三個小時,系統就會報錯
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in /data/Db.php on line 150
查了經常報錯的行數,發現大多是pdo的execute或fetch_All方法報錯。
一開始認為是sql的查詢語句有問題,看了下發現sql語句一般是用limit取十條記錄,而且如果是查詢語句的問題的話也只是會使查詢變慢,不至於溢出啊。
看了網上資料,大多數人說是要主動回收記憶體什麼的,即用unset把不用的對象或變數回收。可是作為一個一直迴圈進程,它的每次邏輯都是同一條,然後變數或對象即使沒有被回收,也會被下次的邏輯需求的同名變數覆蓋啊,如果第一次的邏輯跑通了之後,後面不應該會溢出啊。
求大神幫忙分析一下我思路哪裡有問題,謝謝。
回複內容:
系統跑一個長時間啟動並執行守護進程指令碼,每分鐘掃描一次redis隊列,滿足條件時進入邏輯處理,但每過兩到三個小時,系統就會報錯
PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 72 bytes) in /data/Db.php on line 150
查了經常報錯的行數,發現大多是pdo的execute或fetch_All方法報錯。
一開始認為是sql的查詢語句有問題,看了下發現sql語句一般是用limit取十條記錄,而且如果是查詢語句的問題的話也只是會使查詢變慢,不至於溢出啊。
看了網上資料,大多數人說是要主動回收記憶體什麼的,即用unset把不用的對象或變數回收。可是作為一個一直迴圈進程,它的每次邏輯都是同一條,然後變數或對象即使沒有被回收,也會被下次的邏輯需求的同名變數覆蓋啊,如果第一次的邏輯跑通了之後,後面不應該會溢出啊。
求大神幫忙分析一下我思路哪裡有問題,謝謝。
每分鐘掃描為什麼不做成crontab呢,這樣每次執行完退出,應該不會遇到記憶體的問題吧
可以嘗試監控一下memory在每一行的變化,進行兩次迴圈之後看一下,之前曾經試過在一個迴圈當中即使釋放了變數還是會慢慢的遞增上去的記憶體消耗
限制指令碼記憶體佔用 和 逾時時間