停止imagecreatefromjpeg在PHP中抛出错误

I'm in the process of converting images from external websites references to images stored in my amazon S3 account. I'm running a script to do the conversion for the images I need, however the script continues to break with this error message:

E_WARNING: imagecreatefromjpeg(http://www.site.org/.../I/AK04659a.jpg): failed to open stream: Connection timed out

Is there anyway I can have the script just continue running even if there is an error? Restarting the script is frustrating and counterproductive.

Script:

<?php
ini_set('memory_limit','2048M');
ini_set('max_execution_time', 30000000);
ini_set("user_agent", 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.9) Gecko/20071025 Firefox/2.0.0.9');
ini_set('gd.jpeg_ignore_warning', 1);
$cron = true;
include('init.inc.php');

$query = 'SELECT * FROM city_images WHERE city_id > 0 ORDER BY city_id';
$city_images    = sql::q($query);
//var_dump($cities); die;

while ($row = sql::f_assoc($city_images)) {

//var_dump($row);
$city_id =  $row['city_id'];
$image = image::resize_upload_amazon_new($row['image'], $row['city_id']);

    if(!is_array($image)){
    $sql = "INSERT INTO `city_images_new` (`city_id`, `image`)
            VALUES ('{$city_id}', '{$image}')";

    sql::q($sql);
    }
    //var_dump($image); die;
}
//die;
echo PHP_EOL . "Images converted succesfully"; die;

?>

Sorry for posting, but i can't make comments until 50 reputation.

I think you need to insert a conditional on the transform. I'm supposing that ($row['image'] or $row['city_id']) is the url of the image.

if (! $image = image::resize_upload_amazon_new($row['image'], $row['city_id']))
    continue;

But we can be more precesily if you show us, the method named "resize_upload_amazon_new" from the "image" object

Create your own error handler and turn that E_WARNING into an exception: Can I try/catch a warning?

I'm guessing imagecreatefromjpeg() is within image::resize_upload_amazon_new()

Then you could probably do something like this

while ($row = sql::f_assoc($city_images)) {
  $city_id =  $row['city_id'];
  try {
      $image = image::resize_upload_amazon_new($row['image'], $row['city_id']);
      if(!is_array($image)){
          $sql = "INSERT INTO `city_images_new` (`city_id`, `image`)
                  VALUES ('{$city_id}', '{$image}')";
          sql::q($sql);
      }
  } catch (TimeoutException $e) {
      // Something failed, don't care enough to stop running the script
      // But probably want to log this error somewhere
  }
}

Just remember to call restore_error_handler() after you're done. This'll keep the script running until its done, and you can do something each time it breaks, maybe log the IDs so you know which ones failed.