A inclusão programada de imagens na biblioteca de mídia com o wp_generate_attachment_metadata falha aleatoriamente

4

Estou executando a versão mais recente do WordPress (4.6) em um servidor LAMP (hospedagem compartilhada) com a versão 5.6.12 do PHP.

Estou tentando adicionar 10 imagens programaticamente, carregadas com ftp para o diretório wp-uploads , para a biblioteca de mídia usando as três funções do WordPress wp_insert_attachment , wp_generate_attachment_metadata e wp_update_attachment_metadata .

Meu problema:

Às vezes, meu script PHP funciona (todas as 10 imagens são adicionadas à biblioteca de mídia corretamente) - e às vezes isso não acontece (das 10 imagens, somente 4, 5, 6 ou mais são adicionadas)! Cada imagem tem 2M - 4M de tamanho.

O que eu fiz até agora:

Eu habilitei error_logging via php.ini e descobri que de vez em quando wp_generate_attachment_metadata falha (isto é, enquanto manipula a quinta, sexta, sétima imagem) e todo o meu script PHP termina. Eu não recebo mais informações do error_log () além disso. Desde que eu suspeitei de problemas de memória, eu aumentei o tamanho da memória para php para 120M (meus provedores de hospedagem me deram 128M) e execução de script para 100s (meu provedor de hospedagem me dá 120s). Todos os arquivos existem (é claro), são todos PNGs - e, como eu disse, usando o mesmo conjunto de 10 imagens para testar, às vezes funciona e às vezes não funciona ...

Minha pergunta:

  • Existe um problema conhecido com wp_generate_attachment_metadata no WP 4.6? Tudo funcionou bem até eu atualizar meu site do WP 4.3 para 4.6 ...

  • Se a memória insuficiente está causando o problema, como eu poderia otimizar meu script PHP para lidar com o limite de memória de 128M fornecido pelo meu web hoster?

  • Como descubro se a falta de memória faz com que meu script PHP seja encerrado?

Obrigado antecipadamente!

Aqui está o meu código:

$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' => 'my description',
    'post_content' => 'my description',
    '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);
}
    
por Sebastian 06.09.2016 / 00:28

1 resposta

5

Eu verifiquei seu código e acho que você está perdendo a orientação das imagens. Por favor, dê uma olhada no código abaixo:


$post_id = 1234;
$images = array('filename1.png', 'filename2.png', ... 'filename10.png');

// Get the path to the upload directory.
$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' => 'my description',
        'post_content' => 'my description',
        'post_status' => 'inherit'
         );
$image_id = wp_insert_attachment($attachment, $name, $post_id);
// Make sure that this file is included, as wp_generate_attachment_metadata() depends on it. require_once( ABSPATH . 'wp-admin/includes/image.php' );
// Generate the metadata for the attachment, and update the database record. $attach_data = wp_generate_attachment_metadata( $image_id, $name );
wp_update_attachment_metadata( $image_id, $attach_data );
}

Para detalhes, veja a função wp_insert_attachment .

    
por Syed Fakhar Abbas 06.09.2016 / 01:03