Программное добавление изображений в медиа-библиотеку с wp_generate_attachment_metadata периодически завершается сбоем
Я использую последнюю версию WordPress (4.6) на LAMP сервере (shared хостинг) с PHP версии 5.6.12.
Я пытаюсь программно добавить 10 изображений, загруженных через FTP в директорию wp-uploads
, в медиа-библиотеку используя три функции WordPress: wp_insert_attachment
, wp_generate_attachment_metadata
и wp_update_attachment_metadata
.
Моя проблема:
Иногда мой PHP скрипт работает (все 10 изображений успешно добавляются в медиа-библиотеку) - а иногда нет (из 10 изображений добавляются только 4, 5, 6 или около того)! Каждое изображение имеет размер 2-4 МБ.
Что я уже сделал:
Я включил error_logging через php.ini и обнаружил, что периодически wp_generate_attachment_metadata
завершается с ошибкой (например, при обработке 5-го, 6-го, 7-го или другого изображения) и весь PHP скрипт прерывается. Я не получаю никакой дополнительной информации из error_log(). Поскольку я подозревал проблемы с памятью, я увеличил размер памяти для PHP до 120M (мой хостинг-провайдер предоставляет 128M) и время выполнения скрипта до 100с (провайдер дает 120с).
Все файлы существуют (конечно), все они в формате PNG - и, как я уже сказал, используя один и тот же набор из 10 изображений для тестирования, иногда это работает, а иногда нет...
Мои вопросы:
Есть ли известная проблема с
wp_generate_attachment_metadata
в WP 4.6? Все работало нормально, пока я не обновил сайт с WP 4.3 до 4.6...Если проблема в нехватке памяти, как я могу оптимизировать мой PHP скрипт для работы с лимитом памяти в 128M, предоставленным хостингом?
Как определить, действительно ли нехватка памяти вызывает прерывание PHP скрипта?
Заранее спасибо!
Вот мой код:
$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');
for($i = 0; $i < 10; $i++) {
$attachment = array(
'post_mime_type' => 'image/png',
'post_title' => 'мое описание',
'post_content' => 'мое описание',
'post_status' => 'inherit'
);
$image_id = wp_insert_attachment($attachment, $images[$i], $post_id);
$image_data = wp_generate_attachment_metadata($image_id, $images[$i]);
wp_update_attachment_metadata($image_id, $image_data);
}

Я проверил ваш код и думаю, что вам не хватает GUID для изображений. Пожалуйста, взгляните на код ниже:
$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');
// Получаем путь к директории загрузок
$wp_upload_dir = wp_upload_dir();
foreach($images as $name) {
$attachment = array(
'guid'=> $wp_upload_dir['url'] . '/' . basename( $name ),
'post_mime_type' => 'image/png',
'post_title' => 'Мое описание',
'post_content' => 'Мое описание',
'post_status' => 'inherit'
);<br/>
$image_id = wp_insert_attachment($attachment, $name, $post_id);<br/>
// Убедитесь, что этот файл подключен, так как wp_generate_attachment_metadata() зависит от него
require_once( ABSPATH . 'wp-admin/includes/image.php' );<br/>
// Генерируем метаданные для вложения и обновляем запись в базе данных
$attach_data = wp_generate_attachment_metadata( $image_id, $name );<br/>
wp_update_attachment_metadata( $image_id, $attach_data );<br/>
}
Для подробностей смотрите функцию wp_insert_attachment.

Спасибо, что указали мне на отсутствующий guid
. Я добавлю его в свой код, попробую снова и дам вам знать, решит ли это проблему.

Хм, похоже, что отсутствующий guid
вызывал проблему. После добавления guid всё работает на 100%. Тогда как без guid иногда работало, иногда нет - странно :-) ЕЩЁ РАЗ СПАСИБО ashikra
