[英]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.