某業務付費統計腳本問題排查
- 2019 年 10 月 10 日
- 筆記
現象:產品回饋未收到每周五的VIP郵箱付費統計郵件
1. 這個統計腳本我從未經手過,因此不知道邏輯是什麼,也不知道程式碼在哪裡.通過查看郵件源文件中的來源IP,找到了發出郵件所在的伺服器,信頭中有類似這樣的來源IP X-Originating-IP: [xx.xx.xx.86]
2.登陸伺服器後,查看crontab的定時規則,找到定時規則是0 0 * * * /bin/sh /xxx/feeUser.sh.每天都會執行一次feeUser.sh的腳本.通過cron.log可以看到該腳本已經執行過了
3.腳本中的邏輯是,每天判斷今天的日誌文件是否存在,如果不存在就執行一個php腳本,把該腳本的輸出重定向到這個日誌文件中. 判斷如果是周五,就調用php腳本發送一封通知郵件,郵件的內容是對每天日誌文件的wc -l行數統計.
4.今天是周五但是郵件沒有發出,說明根本就沒有執行到發送郵件的邏輯.在前面的統計今天用戶付費情況時就已經斷掉了.
5.查看php.ini的配置文件,看到沒有開啟log_errors,也沒有指定error_log的位置,所以沒法通過php的日誌看到發生了什麼錯誤
6.此腳本是14年左右開始運行的,時間也比較久了.在研究php程式碼的邏輯後發現,在查詢資料庫的時候,先查出第一個資料庫的某表資訊後,循環查詢另一個資料庫的另一張表,在這個循環的過程中,連接資料庫的邏輯放在了循環塊裡面,猜測可能因為連接過多,被資料庫拒絕後讀取失敗吧.
7.裡面還有處邏輯挺有想法,讀取第一張表的時候,每次只查詢10000條,然後再從新連接資料庫new PDO對象,估計也是為了防止執行時間太長連接斷掉. 每天php腳本把用戶查詢出來後,重定向到比如2019-9-20-user.log,周五在統計每天的日誌行數發送給產品,這樣就可以如果產品需要具體用戶時也可以留著這個結果
8.先把連接資料庫邏輯挪出來,補齊了強兩天斷掉的數據,把錯誤日誌打開暫時先觀察觀察