[英]Working cron job jobs stopped Suddenly, trouble reading external url
更新#2:我已經與NOAA的聯系人確認,他們在整個NOAA上都存在較大的時間互連問題。 例如,他們僅從2個位置獲取降水數據。 我確定這是相關的。 我讓NOAA知道了該線程以及大家都將其識別為連通性問題所做的工作。
更新:現在,wget命令可以在我的本地服務器上運行,而不能從1and1.com服務器上運行。 我想這解釋了為什么它可以在我的瀏覽器中工作。 必須是向東的連接問題,因為你們中有些人也有同樣的問題。 希望這會清除,因為我似乎對此無能為力。
編輯:很明顯,我有它的獲取問題
我的問題是我該如何制作將獲取文件和瀏覽器的代碼?
我已經使用此命令來獲取外部網頁將近兩年了
wget -O <my web site>/data.txt http://www.ndbc.noaa.gov/data/latest_obs/latest_obs.txt
我已經從兩個不同的服務器嘗試了相同的結果,所以我確定我不會被阻止。
今天早上突然停止工作了。 更糟糕的是,這將使進程一直在服務器上運行,直到足以關閉我的帳戶,並且我的所有網站都出錯為止,直到我們一次kill
49
睡眠進程為止。
1and1
技術支持沒有幫助。 他們說這是我的cron腳本,僅是上面的一行。
所以我決定用php重新編寫該文件。 我嘗試了file_get_contents
。 我也嘗試過curl
, fgets
。 但是這些都不起作用,所以我嘗試了天lynx
。
沒有加載該特定的URL,但是我嘗試的所有其他URL都可以正常工作。
但是,如果我只是將http://www.ndbc.noaa.gov/data/latest_obs/latest_obs.txt復制到瀏覽器中,那么沒問題-該文件會立即顯示。
顯然,由於瀏覽器正在執行此文件,因此可以讀取該文件。 我已經嘗試過Chrome
, IE
和Firefox
,但加載此頁面都沒有問題,但是我在代碼中沒有嘗試過。
我要做的是讀取此文件並將其寫入本地服務器以對其進行緩沖。 然后,我的代碼可以解析各種數據請求。
閱讀此外部網頁的可靠方法是什么?
建議添加一個用戶代理,以便將代碼更改為以下內容
function read_url($url){
$agent= 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_URL,$url);
$output = curl_exec($ch);
if(curl_errno($ch)){
echo "<!-- curl_error($ch) -->";
}
curl_close($ch);
return $output;
}
同樣,它可以在其他外部網站上運行,但不能在此外部網站上運行。
我嘗試手動運行wget
:這是我得到的
(uiserver):u49953355:~ > wget -O <my site>/ships_data.txt http://www.ndbc.noaa.gov/data/realtime2/ship_obs.txt
--2013-11-17 15:55:21-- http://www.ndbc.noaa.gov/data/realtime2/ship_obs.txt
Resolving www.ndbc.noaa.gov... 140.90.238.27
Connecting to www.ndbc.noaa.gov|140.90.238.27|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 690872 (675K) [text/plain]
Saving to: `<my site>/ships_data.txt'
0% [ ] 1,066 --.-K/s eta 7h 14m
只是保持在0%
注意<my-site>
是存儲我的數據的網址。 我不想發布我的Bugger區域的地址,但這就像mydomain/buffer/
我只是在另一台服務器(不是1and1)上嘗試過同樣的事情
dad@myth_desktop:~$ wget -O ships_data.txt http://www.ndbc.noaa.gov/data/realtime2/ship_obs.txt
--13:14:32-- http://www.ndbc.noaa.gov/data/realtime2/ship_obs.txt
=> `ships_data.txt'
Resolving www.ndbc.noaa.gov... 140.90.238.27
Connecting to www.ndbc.noaa.gov|140.90.238.27|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 690,872 (675K) [text/plain]
3% [====> ] 27,046 --.--K/s ETA 34:18
這次停留在3%
。
該文件可用,但即使文件很小,也要花很長時間才能下載。 經過幾次嘗試,我花了3分47秒的時間來獲取這個23KB的小文件。
顯然,他們的網絡存在一些問題,您對此無能為力。
考慮使用set_time_limit(600)
來允許您的PHP腳本花費更長的時間(10分鍾)來下載文件,但同時又不要太長,以免失敗時不會卡住。
因為最初,OP無法手動運行wget
命令,所以我猜是服務器IP被阻止了。
手動運行以下命令已掛斷,因此它增加了我所說的推測。
wget -O <my web site>/data.txt http://www.ndbc.noaa.gov/data/latest_obs/latest_obs.txt on the hosted server
在檢查wget
本身是否正常工作時,OP確實將wget
到了虛擬端點。 wget -O <web-site>/google.log www.google.com
有效。
由於OP提到有時會(但並非總是)進行下載,並且下載是從同一托管解決方案的另一台服務器進行的, 所以我認為我們現在可以將其鎖定為其他網站的網絡上的問題 。
我的猜測是,重頭戲的運行頻率非常小(例如每分鍾),例如
* * * * * wget -O <my web site>/data.txt http://www.ndbc.noaa.gov/data/latest_obs/latest_obs.txt
(或類似的小頻率),並且由於外部網站負載的服務器類型不同,較早的請求要么超時,要么未在為其指定的時間段(1分鍾)內完成。
因此,OP面臨一些競爭狀況,其中多個cron進程試圖寫入同一文件,但是由於接收文件包的延遲,它們中的任何一個都無法完全寫入該文件(例如,進程從12:10 AM掛起,另一進程從12:11 AM開始,另外一個在12:12 AM開始,沒有一個結束)
解決方案是使它們變得不那么頻繁,或者如果OP要使用相同的頻率,則僅在當前未進行先前版本的下載時才重新下載。 要檢查某個進程是否已在運行,請檢查此
您的兩個wget命令都對我有用。
同樣,由於您獲得了200個響應代碼和HTTP標頭(內容長度,類型等)以及部分數據(1066字節位於數據的第7-8行),因此NOAA似乎也沒有阻止您的請求。
可能是您的連接(通常或特定於NOAA)連接緩慢或正在通過某些緩沖代理傳遞。 在代理獲取所有或大部分數據之前,要獲取代理,連接就好像已經老化。 檢索此文件是否起作用: http : //www.ndbc.noaa.gov/robots.txt ?
wget的--debug選項也可能有助於找出問題所在。
無論如何,關於掛起wget進程,您可以使用--timeout = 60選項來限制失敗之前的等待時間( http://www.gnu.org/software/wget/manual/wget.html )。
wget -O ships_data.txt http://www.ndbc.noaa.gov/data/realtime2/ship_obs.txt --timeout=10
如果要設置用戶代理(如在PHP腳本中所做的那樣),則可以使用“ --user-agent = Mozilla / 4.0(兼容; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)”選項。
wget -O ships_data.txt http://www.ndbc.noaa.gov/data/realtime2/ship_obs.txt "--user-agent=Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"
關於curl vs wget,您可以只用curl命令替換wget命令(而不是在PHP中這樣做):
curl -o ships_data.txt http://www.ndbc.noaa.gov/data/realtime2/ship_obs.txt --user-agent "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.0.3705; .NET CLR 1.1.4322)"
安德烈
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.