Я пытаюсь:Идеи для массового преобразования изображений - почему это заканчивается из памяти?
- Петля через ~ 4000 папок.
- Получите изображения в каждой папке.
- Создайте несколько изображений разных размеров и сохраните новые изображения в одной папке.
Мой код (ниже) для этого работает, но после того, как он выполнил только несколько папок (возможно, 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>';}
}
}
}
Ваш PHP немного опережает меня - но области, которые, как я подозреваю, 1) ваши * foreach $ results * подразумевают, что несколько изображений будут работать параллельно, увеличивая ваши шансы на замещение ry ошибка. 2) Я не уверен в классе загрузки, который вы используете, но верьте, что существует директива php.ini по максимальному размеру файла. Если какое-либо из ваших изображений превышает это, это может вызвать боль. –