繁体   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