簡體   English   中英

正在執行的Cron作業突然停止,無法讀取外部網址

[英]Working cron job jobs stopped Suddenly, trouble reading external url

更新#2:我已經與NOAA的聯系人確認,他們在整個NOAA上都存在較大的時間互連問題。 例如,他們僅從2個位置獲取降水數據。 我確定這是相關的。 我讓NOAA知道了該線程以及大家都將其識別為連通性問題所做的工作。


更新:現在,wget命令可以在我的本地服務器上運行,而不能從1and1.com服務器上運行。 我想這解釋了為什么它可以在我的瀏覽器中工作。 必須是向東的連接問題,因為你們中有些人也有同樣的問題。 希望這會清除,因為我似乎對此無能為力。


編輯:很明顯,我有它的獲取問題

  1. NOAA地址的獨特之處在於我的代碼和其他網站沒有問題
  2. 在正常的瀏覽器中所有提取都可以正常工作
  3. 我無法嘗試使用代碼來獲取文件。

我的問題是我該如何制作將獲取文件和瀏覽器的代碼?


我已經使用此命令來獲取外部網頁將近兩年了

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 我也嘗試過curlfgets 但是這些都不起作用,所以我嘗試了天lynx

沒有加載該特定的URL,但是我嘗試的所有其他URL都可以正常工作。

但是,如果我只是將http://www.ndbc.noaa.gov/data/latest_obs/latest_obs.txt復制到瀏覽器中,那么沒問題-該文件會立即顯示。

顯然,由於瀏覽器正在執行此文件,因此可以讀取該文件。 我已經嘗試過ChromeIEFirefox ,但加載此頁面都沒有問題,但是我在代碼中沒有嘗試過。

我要做的是讀取此文件並將其寫入本地服務器以對其進行緩沖。 然后,我的代碼可以解析各種數據請求。

閱讀此外部網頁的可靠方法是什么?


建議添加一個用戶代理,以便將代碼更改為以下內容

    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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM