2016-03-10 4 views
0

Я пытаюсь:Идеи для массового преобразования изображений - почему это заканчивается из памяти?

  1. Петля через ~ 4000 папок.
  2. Получите изображения в каждой папке.
  3. Создайте несколько изображений разных размеров и сохраните новые изображения в одной папке.

Мой код (ниже) для этого работает, но после того, как он выполнил только несколько папок (возможно, 50), он дает ошибку «из памяти». Это займет около 5 минут. Я попытался увеличить максимальный объем памяти, который я могу найти в php.ini (до 1000 МБ), но я все равно получаю ту же ошибку «из памяти» и с тем же значением.

Мой сервер показывает, что почти ничего не делает (16 ядер/36gig ram), поэтому я не думаю, что это аппаратный лимит.

Извините, если это не подходящее место, чтобы задать этот вопрос, но есть ли у кого-нибудь идеи, как я могу изменить размер (и переименовать) все эти изображения?

код я использую ниже:

ini_set('max_execution_time', 60000); 

define('IMAGEWidth', 800); 
define('IMAGEHeight', 800); 
define('THUMBNAILWidth', 109); 
define('THUMBNAILHeight', 164); 
define('THUMBNAILWidthLARGE', 180); 
define('THUMBNAILHeightLARGE', 270); 

define('MAX_BYTE_IMAGE_SIZE', 83886080);         // max files size allowed = 10MB 
//** ============ images sizes =============== 
// small thumb 
$imageSize_arr[] = array('image_resize' => true, 'image_x' => THUMBNAILWidth, 'image_ratio_y' => true, 'jpeg_quality' => 80, 'image_min_width' => 100, 'image_unsharp_amount' => 80, 'file_name_body_add' => '_thumb'); 
// normal thumb 
$imageSize_arr[] = array('image_resize' => true, 'image_x' => THUMBNAILWidthLARGE, 'image_ratio_y' => true, 'jpeg_quality' => 80, 'image_min_width' => 100, 'image_unsharp_amount' => 80, 'file_name_body_add' => '_largethumb'); 
// full size image 
$imageSize_arr[] = array('image_resize' => true, 'image_x' => IMAGEWidth, 'image_ratio_y' => true, 'jpeg_quality' => 80, 'image_min_width' => 100, 'image_unsharp_amount' => 80); 
//origional file 
$imageSize_arr[] = array('image_resize' => false, 'file_name_body_add' => '_origional'); 


require('upload.class.php'); 
$path = '/var/www/import/propertyimages/'; 
$results = scandir($path); 
//echo '<pre>'; 
//print_r($results); 
//echo '</pre>'; 

foreach ($results as $result) { 
    if ($result === '.' || $result === '..') {continue;} 

    if (is_dir($path.$result)) { 
     $path2 = $path.$result; 
     echo '<h1>'.$path2.'</h1><br>'; 
     $results2 = scandir($path2); 
     //echo '<pre>'; 
     //print_r($results2); 
     //echo '</pre>'; 

     foreach ($results2 as $image) { 
      if ($image === '.' || $image === '..') {continue;} 
      //echo 'image = '.$path2.'/'.$image.'<br>'; 
      $sourcePath = $path2.'/'.$image; 

      //global $imageSize_arr; 
      $handle = new upload($sourcePath); // initiate upload class and provide file to be altered 
      $fileName = $image; 

      if ($handle->uploaded) { 
       foreach ($imageSize_arr as $size_arr){      // get image sizes from config.php 
        $handle->file_new_name_body = $fileName;    // set the file name 
        $handle->file_overwrite  = true; 
        $handle->file_max_size  = MAX_BYTE_IMAGE_SIZE; // get max image sizes from config.php      
        $handle->allowed    = array('image/*');  // set allowed file types 
        foreach($size_arr as $key=>$value){      // get image convertion types from $imageSize_arr/$size_arr 
         $handle->$key = $value; 
        }           
        $handle->process($path2.'/'); // prosess the image and save to specified location 
       }    

       // check if all went well 
       if ($handle->processed) { 
        $handle->clean(); 
        $handle->error; 
        echo 'done<br>'; 
       } 
       else { 
        echo $handle->error; 
        echo 'error<br>';     
       } 
      } 
      else {echo '<strong>ERROR</strong>'.$handle->error.'<br>';} 
     } 
    } 
} 
+0

Ваш PHP немного опережает меня - но области, которые, как я подозреваю, 1) ваши * foreach $ results * подразумевают, что несколько изображений будут работать параллельно, увеличивая ваши шансы на замещение ry ошибка. 2) Я не уверен в классе загрузки, который вы используете, но верьте, что существует директива php.ini по максимальному размеру файла. Если какое-либо из ваших изображений превышает это, это может вызвать боль. –

ответ

0

может или не может иметь некоторую помощь: Clearing Memory

Вы также можете добавить это в скрипт, чтобы увеличить объем памяти:

ini_set('memory_limit', '2048M'); 
+0

спасибо, сейчас я пытаюсь это сделать – Ford

+0

из 16 ядер, доступных только CPU1, составляет 100%, остальные 15 - около 1%. есть ли способ сделать это многоядерным (я запускаю VM через рабочую станцию ​​VMware)? – Ford

+0

Это должно помочь: http://stackoverflow.com/questions/2267345/how-do-you-make-good-use-of-multicore-cpus-in-your-php-mysql-applications – VikingBlooded

Смежные вопросы