最近在使用imagecreatefromjpeg,imagecopy 缓存一些略缩图,遇见一个奇怪的问题。1. 浏览器直接输入图片地址,可以正常打开(打开速度很慢)。2. 使用 imagecreatefromjpeg,产生500错误。3. 浏览器打开过一次图片,再使用imagecreatefromjpeg,PHP代码可以工作。4. 加一段curl,先模拟浏览器打开一次图片,再使用imagecreatefromjpeg, PHP代码可以工作。
图片地址: http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/7_nani_6.jpg/450px-7_nani_6.jpg错误信息:
imagecreatefromjpeg(http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/7_nani_6.jpg/450px-7_nani_6.jpg): failed to open stream: HTTP request failed! HTTP/1.0 500 Internal Server Errorcurl 代码:    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "http://upload.wikimedia.org/wikipedia/commons/thumb/2/29/7_nani_6.jpg/450px-7_nani_6.jpg");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 GTB5');
    $gets = curl_exec($ch);
    curl_close($ch);问题:这到底是什么原因造成的?是由于图片地址打开速度慢,imagecreatefromjpeg 抓取时超时?使用curl代码,可以截取图片,但是代码运行时间加倍。有什么方法可以解决吗,比如设置imagecreatefromjpeg超时;直接结合curl和imagecreatefromjpeg,缩短运行时间?谢谢。PS:试过get_file_contents(图片地址),同样500错误,看来只有curl比较耐心,不会超时,只是运行速度非常慢。

解决方案 »

  1.   

    get_file_contents(图片地址),同样500错误
    不错误才怪file_get_contents打开的是网络的图片,跟您的网速有关
      

  2.   

    如何查看错误日志?
    php.ini里已经开启
    display_errors = On
    error_reporting = E_ALL & ~E_DEPRECATED & ~E_NOTICE
    但是打开error.log,没有发现相关的错误提示。
      

  3.   

    使用 curl 或 file_get_contents 2+ 次,确认远程图片能正确缓存于本地
    用 imagecreatefromstring 打开到资源
      

  4.   

    老大,怎么确认图片是否已缓存了呢?思路可不可以这样:用 for 循环 file_get_contents,然后用 getimagesize 判别 缓存到本地的图片尺寸大于10kb,如果是,break;如果否,继续 for 循环?另外:getimagesize 大于 10k ,是否可以保证图片已经正确被缓存?(错误缓存时,图片都是统一大小1.39KB,会不会出现缓存一半时file_get_contents断线的可能?)谢谢。
      

  5.   

    怎么确认图片是否已缓存了呢?这很简单,比如你使用 file_get_contents 获取远程图片
    do {
      $s = file_get_contents($url);
    }while($im = imagecreatefromstring($s) === FALSE);你可以保存 $s 以备后用
    你可以直接使用图像资源 $im
    你还可以在循环中加入有条件中断的代码
      

  6.   

    非常感谢老大的指点。
    再问一个问题,如果在CURL里加入 curl_setopt($ch,curlopt_connecttimeout,0) ,是不是可以强制curl等待打开完整页面后,再执行下一步程序?
      

  7.   

    CURLOPT_CONNECTTIMEOUT 指定的是连接超时
    0 就是总是等待