V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
grey5659
V2EX  ›  PHP

PHP 批量下载图片总是中途断开?

  •  
  •   grey5659 · 2017-02-17 02:53:26 +08:00 · 3141 次点击
    这是一个创建于 2837 天前的主题,其中的信息可能已经有所发展或是发生改变。
    set_time_limit(0);
    //省略代码
    $path="照片";
    while($row = $query->fetch()) {
        $image_arr.=$row[1].$row[2];
    }
    $image_array=explode(',',$image_arr);//获得一个数组,类似('a00001','a00002')
    
    foreach($image_array as $v){
        $image=file_get_contents("http://111.11.11.111:80/IMG_".$v."_2122.jpg");//拼接图片地址
        file_put_contents(iconv("UTF-8", "GBK", $path."/".$v.".jpg"),$image);//下载图片
    
    }
    

    一共大概有 2000 张图片,为什么总是到中途(三四百张)就会中断了,报 500 错误

    第 1 条附言  ·  2017-02-17 15:45:41 +08:00
    对了,服务器网站程序是 java,这个是在本地 php 环境运行的,这样有什么影响吗?
    12 条回复    2017-02-17 21:07:01 +08:00
    ji4ozhu
        1
    ji4ozhu  
       2017-02-17 03:03:36 +08:00
    目标服务器 WEBSERVICE 短暂挂了
    grey5659
        2
    grey5659  
    OP
       2017-02-17 03:04:49 +08:00
    @ji4ozhu 请问怎么解决呢
    CEBBCAT
        3
    CEBBCAT  
       2017-02-17 03:31:41 +08:00 via Android   ❤️ 1
    @grey5659 要是是按照 @ji4ozhu 的说法,那应该让程序歇一歇,等对方服务器恢复正常再开始抓取图片。另外,您一件事情发三个帖子是不是不太好?
    msg7086
        4
    msg7086  
       2017-02-17 03:33:34 +08:00
    给对方的站长打个电话,告诉他网站被你搞挂了,让他赶紧起来修服务器。
    william23
        5
    william23  
       2017-02-17 07:32:21 +08:00 via iPhone
    #3 说的对,以前我在公司也有相同的案例,我也是不停地去拿数据,但是对方服务器是做了限制的,因为都是自己公司,好沟通,后来还是要让我这里做改动,让你这里每下载到一定的量就歇一歇,或者就是每过一段时间歇一歇,我当时是选择前者的,虽然我不是下载图片。。
    hellommd
        6
    hellommd  
       2017-02-17 08:11:01 +08:00 via iPhone
    楼主的代码,异常情况都不考虑一下?

    建议加入重试机制,异常捕抓。
    dsg001
        7
    dsg001  
       2017-02-17 08:21:31 +08:00
    如果没有其他需求, php 保存图片列表,然后用 wget 下载
    my101du
        8
    my101du  
       2017-02-17 08:34:14 +08:00
    请继续等待。
    最近我正好在搞这个东西,下载 1200 多张图片, Nginx 已经报 502 还是 504 了。但是观察文件夹,文件还在继续增加。可能是因为我设置了 php-fpm 的运行终止 timeout=0
    grey5659
        9
    grey5659  
    OP
       2017-02-17 08:34:29 +08:00 via Android
    @CEBBCAT 好像是卡了,记得没点提交多次……想删也删不掉……
    grey5659
        10
    grey5659  
    OP
       2017-02-17 08:41:49 +08:00 via Android
    @my101du 每次浏览器中断报 500 错误的时候确实服务器挂掉了一样(应用无法访问),要在服务器的 tomcat 命令行窗口随便按一下键盘才会恢复……不知道是怎么回事
    misaka20038numbe
        11
    misaka20038numbe  
       2017-02-17 08:43:28 +08:00
    如果是我来做的话,我会将文件名和状态写入一张数据表,然后 php 依次读取状态为未完成的文件。脚本下载成功则修改状态,直到所有文件状态为完成则结束,且成功下载一次就刷新脚本页面一次防止脚本执行超时。
    techmoe
        12
    techmoe  
       2017-02-17 21:07:01 +08:00
    **告诉我哪里报 500 了**
    如果是被抓取的 URL 返回 500 那无可或非是对方那边出的问题
    但如果你是在浏览器中跑这个脚本浏览器返回 500 那只能说明是这个脚本运行报错了
    诸如抓取过程中内存爆炸,或者 IO 错误,都有可能造成致命错误,如果是在浏览器里就肯定会直接返回 500 了
    需要强调的一点是,对于抓取这种耗时长的操作,**尽量使用 CLI 模式运行脚本**(说白了就是在命令行下`php script.php`这样直接执行脚本而不是通过浏览器)
    同时建议`error_reporting(E_ALL)`
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2702 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 10:23 · PVG 18:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.