1. 程式人生 > >記一次php指令碼memory exhausted

記一次php指令碼memory exhausted

表象報錯如下:
Error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 16651985 bytes)
出這個問題 意味著PHP指令碼使用了過多的記憶體,並超出了系統對其設定的允許最大記憶體。

解決方法一般是php.ini中的memory_limit中的引數設定的太小,修改為合適大小後重啟php-fpm,或者在指令碼中申明ini_set('memory_limit’,’512M');就可以解決。

奇葩的是這次碰到這個問題是因為一個事務導致,偽邏輯如下
beginTransaction
1.create card record;(直接DB操作)
2.create order record;(直接DB操作)
3.send order detail to another system (http request)
成功
commit
失敗
roolbak

分析問題:
1.修改memory_limit的配置,發現依舊報這個錯誤
2.指令碼中新增ini_set('memory_limit’,’512M');發現依舊報這個錯誤
3.最後發現表中自增id被佔用了,但是沒有資料,說明事務中的第一步和第二步已經被執行入了,但是因為某一步(最後發現是第三步)失敗導致回滾,這才意識到在事務中請求第三方介面會導致這個問題。

修改:
將事務中的第三步放在事務外面執行。

總結:事務中最好只放直接表插入或者修改的操作。