每天定时检测404链接
? ? ? ? 有一種業務需求是每天都要去采集很多鏈接,然后保存到數據庫;有一種情況是你采集回來的鏈接有很多可能是不存在的頁面,或者說過兩天就不存在了,統稱死鏈接;還有一種需求就是我要確保我采集回來的鏈接都不會是404的,至少能夠把404的情況降到最低。
可能有人會想,那簡單,在采集回來的鏈接,循環每一條鏈接地址,然后獲取它的頭部信息返回的狀態碼判斷是不是404,如果不是才保存到數據庫,這不是最簡單直接的方式嗎?
? ? ? ? 如果只是采集那么一千幾百條的,那沒有問題,也就是耗點時間,在php里面get_headers函數大概一秒能夠獲取到4條鏈接的頭部信息,而且還是在網絡好的情況下,如果采集上萬條,那就會隨隨便便給你報個502或者504錯誤,你可能會想著把php-fpm.conf里面的request_terminate_timeout =300的請求時間改大一點,再把php的set_time_limit(3600)改大一點,因為一般的請求都不會超過5分鐘,如果超過了,就會報上面錯誤,但只是改大一些參數,我覺得只是治標不治本,而且這種請求很容易會拖慢整個網站的性能。
? ? ? ? 我暫時能夠想到的就是shell+php的處理方式,弄個定時任務每天跑。
? ? ? ? 上面的腳本代碼的功能在于,一個是放鏈接地址的urls.txt文件,另一個是存查出來的結果的status_code.txt文件,腳本執行的時候,先把這兩個文件清空,然后再執行php,php里面會從數據庫里把鏈接查出來,然后以\n連接保存到urls.txt文件,php后面的000只是我自定義的參數,由于考慮到性能與可用性,我使用并發請求,這樣能夠提高處理速度,并發數設置100,循環獲取鏈接之后把字符串切割開,切割的字符串為‘|=|’,這個字符串是我在php里面定義的。例如保存的時候我會把鏈接跟id一起保存(http://aaa.com/abc.php|=|123456)。
? ? ? ? 所以。需要切割后單獨使用鏈接地址以及id數據,在接下來的代碼里面,通過curl獲取到鏈接的返回狀態碼,判斷如果是404或者400的情況就把對應的id值保留在status_code.txt里面。這樣執行完成后,就過濾出我們所需要的鏈接所對應的數據庫id
? ? ? ? 最后一步也是執行php,在php里面根據生成的status_code.txt里面的id值,直接把數據從數據表里面刪除,同時生成一個死鏈文檔,其實在php里面所做的處理要看你具體業務,這里只是簡單說明一下。
? ? ? ? 使用shell+php的方式,15000條數據的處理也只是用了2分鐘左右,那么最后,就可以把shell的執行交給定時任務,每天執行一次,就可以達到我想要的效果了。
總結
以上是生活随笔為你收集整理的每天定时检测404链接的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用友u852找不到本地服务器,用友U85
- 下一篇: domain adaptation论文记