更新#2: 我已经与NOAA的联系人确认他们在整个NOAA都有很长时间的互连问题。例如,他们只从2个地点获取降水数据。我相信这是相关的。我让NOAA了解这个主题以及你们所做的工作,以确定这是一个连接问题。
更新:现在wget命令可以从我的本地服务器运行,但不能从1and1.com服务器运行。我想这解释了为什么它可以在我的浏览器中运行。必须是东部的连接问题,因为你们中的一些人也有同样的问题。希望这会清楚,因为看起来我无能为力。
编辑:很明显,我正在获取提取问题
我的问题是我如何制作能够获取文件的代码以及浏览器?
我已经使用此命令获得了近2年的外部网页
wget -O <my web site>/data.txt http://www.ndbc.noaa.gov/data/latest_obs/latest_obs.txt
我已经从两台不同的服务器上尝试了相同的结果,所以我确信我没有被阻止。
今天早上突然停止工作。更糟糕的是,它会让进程在服务器上运行,直到有足够的时间关闭我的帐户并且我的所有网站都出错了,直到我们kill
一次49
为止{}睡眠过程。
我没有得到1and1
技术支持的帮助。他们说这是我的cron脚本,这只是上面的一行。
所以我决定用php重写文件get。我试过了file_get_contents
。我也尝试了curl
,fgets
。但这一切都没有用,所以我尝试了lynx
。
没有任何内容加载此特定网址,但我尝试的所有内容都可以在其他网址上正常使用。
但如果我只是将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/
我刚从另一台服务器(不是1和1)尝试了同样的事情
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%
。
答案 0 :(得分:1)
该文件可用,但即使它很小,也需要很长时间才能下载。在几次尝试中,我经历了长达3分47秒的时间来获取这个23KB的小文件。
显然他们的网络存在一些问题,你无能为力。
考虑使用set_time_limit(600)
允许您的PHP脚本花费更长时间(10分钟)来下载文件,但同时不会太长,以免在失败时卡住。
答案 1 :(得分:1)
从最初开始,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提到有时会继续下载,但并非总是如此,并且它来自同一托管解决方案的其他服务器,我认为我们现在可以将其列为其他网站网络上的问题。
我的猜测是,crons以非常小的频率运行(比如说每分钟),就像
一样* * * * * wget -O <my web site>/data.txt http://www.ndbc.noaa.gov/data/latest_obs/latest_obs.txt
(或者频率类似的频率),并且由于外部网站的服务器负载类型,早先的请求要么超时,要么在规定的时间内没有完成(1分钟)。
由于这一点,OP面临着一些竞争条件,其中多个cron进程正在尝试写入同一个文件,但由于文件的接收数据包延迟,它们都无法完全写入它(例如,一个进程从上午12:10开始,另一个进程从上午12:11开始,另一个进程在上午12:12开始,没有一个超过)
解决这个问题的方法是让它们不那么频繁,或者如果OP想要使用相同的频率,那么只有在下载的先前版本当前没有进行时才重新下载。要检查进程是否已在运行,请检查this
答案 2 :(得分:1)
你的wget命令都适用于我。
似乎NOAA也没有阻止您的请求,因为您获得了200个响应代码和HTTP标头(内容长度,类型等)和部分数据(1066字节位于第7-8行的某个位置)数据)。
可能是您的连接(通常或特别是NOAA)很慢或通过某些缓冲代理传递。在代理获取全部或大部分数据之前,要看到它看起来像连接正在变形。是否可以检索此文件:http://www.ndbc.noaa.gov/robots.txt?
选项 - 调试wget也可能有助于找出问题。
无论如何,关于挂起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)"
安德烈