有时循环调整图像大小 return 不完整或黑色图像

Image resizing in loop sometimes return incomplete or black images

我有一堆图片链接需要在服务器本地下载。大多数请求工作正常,但有时当作业在预定的夜间运行时,它 returns 黑色图像。已检查来源并提供正确的图像。

很少它也 returns 黑色图像,左上角有实际图片,但非常小。

该数组包含大约 150 张要获取和调整大小的图像。

首先,我下载文件:

function downloadFile($url, $path) {
    $file = basename($url);
    $source = file_get_contents($url);
    $fp = fopen($path. $file, 'w');
    set_time_limit(0);
    $options = array(
      CURLOPT_FILE    => $fp,
      CURLOPT_TIMEOUT =>  28800, 
      CURLOPT_URL     => $fp,
    );

    $ch = curl_init();
    curl_setopt_array($ch, $options);
    curl_exec($ch);


    fwrite($fp, $source);

    fclose($fp);
    curl_close($ch);

}

然后调整大小:

   function Img_Resize($path) {

       $x = getimagesize($path);            
       $width  = $x['0'];
       $height = $x['1'];

       $rs_width  = 245;//resize to half of the original width.
       $rs_height = 163;//resize to half of the original height.

       switch ($x['mime']) {
          case "image/gif":
             $img = imagecreatefromgif($path);
             break;
          case "image/jpeg":
             $img = imagecreatefromjpeg($path);
             break;
          case "image/jpg":
             $img = imagecreatefromjpeg($path);
             break;
          case "image/png":
             $img = imagecreatefrompng($path);
             break;
       }

       $img_base = imagecreatetruecolor($rs_width, $rs_height);
       imagesetinterpolation($img_base, IMG_BICUBIC);
       imagecopyresampled($img_base, $img, 0, 0, 0, 0, $rs_width, $rs_height, $width, $height);

       $path_info = pathinfo($path);    
       switch ($path_info['extension']) {
          case "gif":
             imagegif($img_base, $path);  
             break;
          case "jpeg":
             imagejpeg($img_base, $path);  
             break;
          case "jpg":
             imagejpeg($img_base, $path);  
             break;
          case "png":
             imagepng($img_base, $path);  
             break;
       }

    }

如下:

foreach ($URLimages as &$value) {
    if (strpos($value->image, '.jpg')) {
    downloadFile($value->image, $path);
    $test = basename($value->image);
    $img = Img_Resize($path . $test);
    }
}

您确定您使用的是 CURLOPT_TIMEOUT 而不是 CURLOPT_TIMEOUT_MS 吗?

28800 秒超时似乎很高。 如果您在其他地方将 CURLOPT_TIMEOUT_MS 设置为较低的值,则采用最低值。

当下载文件的时间超过您的超时时间时,您会得到一个不完整的文件...

downloadFile 似乎承担了一切 'just works'。生活和编程不是这样的。

以下是我预计可能会出现错误并在发生时采取措施的一些区域。如果需要,您可以通过其他方式执行此操作,例如使用 try...catch 和抛出异常。

$source = file_get_contents($url);
if (!$source) { // failed - retry or take other action
    return false;
}

$fp = fopen($path. $file, 'w');
if (!$fp) { // file didn't open ...
    return false;
}

$ch = curl_init();
if (!$ch) { // curl session didn't start ...
    return false;
}

if (!curl_exec( $ch)) { // curl session didn't work
    return false;
}

if (!fwrite($fp, $source)) { // data didn't get written to file
    return false;
}


// return success
return true;
}

您的主要代码不应尝试为下载失败生成图像:

foreach ($URLimages as &$value) {
  if (strpos($value->image, '.jpg')) {
    if (downloadFile($value->image, $path)) {
      $test = basename($value->image);
      $img = Img_Resize($path . $test);
    }
  }
}