工作cron工作岗位突然停止,无法读取外部URL

时间:2013-11-17 20:34:50

标签: php linux cron wget file-get-contents

更新#2: 我已经与NOAA的联系人确认他们在整个NOAA都有很长时间的互连问题。例如,他们只从2个地点获取降水数据。我相信这是相关的。我让NOAA了解这个主题以及你们所做的工作,以确定这是一个连接问题。


更新:现在wget命令可以从我的本地服务器运行,但不能从1and1.com服务器运行。我想这解释了为什么它可以在我的浏览器中运行。必须是东部的连接问题,因为你们中的一些人也有同样的问题。希望这会清楚,因为看起来我无能为力。


编辑:很明显,我正在获取提取问题

  1. NOAA地址独有,因为我的代码和其他网站没有问题
  2. 所有提取在普通浏览器中都能正常工作
  3. 我无法尝试使用代码获取文件。
  4. 我的问题是我如何制作能够获取文件的代码以及浏览器?


    我已经使用此命令获得了近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。我也尝试了curlfgets。但这一切都没有用,所以我尝试了lynx

    没有任何内容加载此特定网址,但我尝试的所有内容都可以在其他网址上正常使用。

    但如果我只是将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/


    我刚从另一台服务器(不是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%

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对虚拟端点执行了wgetwget -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)"

安德烈