1. 程式人生 > >php debug二三事

php debug二三事

最近php相關專案遇到了一些問題,處理起來讓人感覺挺有意思,寥寥記下。

1.php執行後常駐記憶體裡,需要kill掉該程序再重啟,才能讓修改後的程式碼生效。

之前有一次組裡小夥伴修改了一個長期後臺程序執行的php指令碼,增加了一些業務邏輯判斷。之後我進行部署之時一直忘記將其php程序kill掉,測試的時候一直找不到未生效的原因。後面想到了後臺持續run的指令碼是從記憶體裡面讀取的程式碼塊,而不是載入最新的程式碼指令碼。對於php我們常常腦補無需重啟(如node)或者編譯(java)直接生效,但是對於一直執行的指令碼不然。

Tips 2 如果使用ps aux | grep xxx來判斷指令碼是否執行,請儘量

精準grep

 

又是一次後臺程序任務的新增,採用方式的是shell指令碼監控php程序並維護其始終執行。這次我因為事情比較忙,讓F君自己動手在測試服上寫好shell去執行。後面發現一直沒有成功run起來php任務。

我先嚐試了直接php命令執行php指令碼是沒問題的,排查了指令碼本身的問題。然後又仔細看了一下shell發現也沒什麼問題,最後通過對比之前的寫法,發現是因為在判斷是否有php指令碼進行的時候用的grep 不夠精準,如下圖。

很湊巧的是,F君寫的shell指令碼的名字也是new_notice,和php指令碼名撞名了。所有儘管shell裡面是while true

的死迴圈,但是每次檢查都會發現有叫new_notice的程序(因為同名shell指令碼一直保持執行),故而不會進行啟動php程序的邏輯塊,後臺任務也永遠無法執行。養成習慣精準grep或者將shell指令碼名改為更抽象的名稱都是不錯的方法。但是本質是grep要精準到指令碼全稱,包括檔案擴充套件字尾名。

 

Tips 3 報錯要重視,框架要熟悉。

 

為了減少老框架的束縛,我鼓勵組內小夥伴在一些業務牽連不大的新專案中嘗試使用新的框架來做業務。今天剛好是新的統計服務部署到線上的時間,我剛部署完後,F君和我說mongoauth failed。經過一頓baidu後,發現需要在

tp5mongo driver實現裡面修改原始碼,把MongoDB\Driver\Manager的連線URI最後加上database引數。嘗試新增後不再報auth failed的錯誤,卻直接頁面顯示該網站永久性轉移。去掉後又報auth failed,對比線上和測試服的程式碼和mongo擴充套件版本都沒有什麼問題,也曾懷疑過兩個環境的mongo sever版本問題,發現差異也不大。

 

經過一頓猛如虎的操作,最後發現是因為專案根目錄下沒有runtime目錄造成的。一邊趕地鐵回家,一邊刷著知乎的我發誓以後一定要重視框架的細節,細節決定很多步,包括下一步。