Программное добавление изображений в медиа-библиотеку с wp_generate_attachment_metadata периодически завершается сбоем

6 сент. 2016 г., 01:28:44
Просмотры: 23.5K
Голосов: 8

Я использую последнюю версию 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);
}
0
Все ответы на вопрос 1
4
13

Я проверил ваш код и думаю, что вам не хватает 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.

6 сент. 2016 г. 02:03:41
Комментарии

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

Sebastian Sebastian
6 сент. 2016 г. 10:42:35

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

Sebastian Sebastian
7 сент. 2016 г. 13:34:45

Не за что, @Sebastian :)

Syed Fakhar Abbas Syed Fakhar Abbas
8 сент. 2016 г. 01:11:49

Думаю, WP заблокировал возможность изменять GUID таким способом, так как у меня не получается его обновить. Кто-нибудь знает другой способ?

Drew Baker Drew Baker
24 нояб. 2020 г. 17:37:26