日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天定时检测404链接

發(fā)布時間:2023/12/16 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天定时检测404链接 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

? ? ? ? 有一種業(yè)務(wù)需求是每天都要去采集很多鏈接,然后保存到數(shù)據(jù)庫;有一種情況是你采集回來的鏈接有很多可能是不存在的頁面,或者說過兩天就不存在了,統(tǒng)稱死鏈接;還有一種需求就是我要確保我采集回來的鏈接都不會是404的,至少能夠把404的情況降到最低。

可能有人會想,那簡單,在采集回來的鏈接,循環(huán)每一條鏈接地址,然后獲取它的頭部信息返回的狀態(tài)碼判斷是不是404,如果不是才保存到數(shù)據(jù)庫,這不是最簡單直接的方式嗎?

? ? ? ? 如果只是采集那么一千幾百條的,那沒有問題,也就是耗點時間,在php里面get_headers函數(shù)大概一秒能夠獲取到4條鏈接的頭部信息,而且還是在網(wǎng)絡(luò)好的情況下,如果采集上萬條,那就會隨隨便便給你報個502或者504錯誤,你可能會想著把php-fpm.conf里面的request_terminate_timeout =300的請求時間改大一點,再把php的set_time_limit(3600)改大一點,因為一般的請求都不會超過5分鐘,如果超過了,就會報上面錯誤,但只是改大一些參數(shù),我覺得只是治標(biāo)不治本,而且這種請求很容易會拖慢整個網(wǎng)站的性能。

? ? ? ? 我暫時能夠想到的就是shell+php的處理方式,弄個定時任務(wù)每天跑。


#!/bin/bash Urls='/data/urls.txt' Http_Code='/data/status_code.txt' ####php###### >$Urls >$Http_Code/usr/local/php/bin/php -q /www/do.php 0000 ##############THREAD_NUM=100 mkfifo tmp exec 9<>tmp for ((i=0;i<$THREAD_NUM;i++)) do echo -ne "\n" 1>&9 donefor urlstr in `cat $Urls` do {read -u 9{arr_u=(${urlstr//|=|/ })line=${arr_u[0]}url_id=${arr_u[1]}status_code=`curl -I -m 5 -o /dev/null -s -w %{http_code} $line`#echo -e "$line\t$status_code" |tee -a $Http_Codeif [ "$status_code" = "404" -o "$status_code" = "400" ]then#codemd5=`printf $line|md5sum|tr -d " -"`#echo -e "$line|$url_id|$status_code" | tee -a $Http_Codeecho "$url_id" >> $Http_Codefiecho -ne "\n" 1>&9}& } done < $Urls wait echo "complete!" rm tmp ############################### /usr/local/php/bin/php -q /www/do.php 0000 del
? ? ? ? 上面的腳本代碼的功能在于,一個是放鏈接地址的urls.txt文件,另一個是存查出來的結(jié)果的status_code.txt文件,腳本執(zhí)行的時候,先把這兩個文件清空,然后再執(zhí)行php,php里面會從數(shù)據(jù)庫里把鏈接查出來,然后以\n連接保存到urls.txt文件,php后面的000只是我自定義的參數(shù),由于考慮到性能與可用性,我使用并發(fā)請求,這樣能夠提高處理速度,并發(fā)數(shù)設(shè)置100,循環(huán)獲取鏈接之后把字符串切割開,切割的字符串為‘|=|’,這個字符串是我在php里面定義的。例如保存的時候我會把鏈接跟id一起保存(http://aaa.com/abc.php|=|123456)。

? ? ? ? 所以。需要切割后單獨使用鏈接地址以及id數(shù)據(jù),在接下來的代碼里面,通過curl獲取到鏈接的返回狀態(tài)碼,判斷如果是404或者400的情況就把對應(yīng)的id值保留在status_code.txt里面。這樣執(zhí)行完成后,就過濾出我們所需要的鏈接所對應(yīng)的數(shù)據(jù)庫id

? ? ? ? 最后一步也是執(zhí)行php,在php里面根據(jù)生成的status_code.txt里面的id值,直接把數(shù)據(jù)從數(shù)據(jù)表里面刪除,同時生成一個死鏈文檔,其實在php里面所做的處理要看你具體業(yè)務(wù),這里只是簡單說明一下。

? ? ? ? 使用shell+php的方式,15000條數(shù)據(jù)的處理也只是用了2分鐘左右,那么最后,就可以把shell的執(zhí)行交給定時任務(wù),每天執(zhí)行一次,就可以達到我想要的效果了。

總結(jié)

以上是生活随笔為你收集整理的每天定时检测404链接的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。