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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

每天定时检测404链接

發布時間:2023/12/16 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 每天定时检测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的處理方式,弄個定時任務每天跑。


#!/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文件,另一個是存查出來的結果的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链接的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。