PHP長時間啟動並執行守護指令碼記憶體溢出,來大神分析一下。

來源:互聯網
上載者:User
關鍵字 php 記憶體溢出
系統跑一個長時間啟動並執行守護進程指令碼,每分鐘掃描一次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在每一行的變化,進行兩次迴圈之後看一下,之前曾經試過在一個迴圈當中即使釋放了變數還是會慢慢的遞增上去的記憶體消耗

限制指令碼記憶體佔用 和 逾時時間

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.