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