2009-03-21 13 views
5

Como muchos antes que yo, estoy escribiendo un script PHP para hacer algunas imágenes en miniatura. La secuencia de comandos obtuvo la certificación WOMM (funciona en mi máquina), pero cuando la muevo a mi host (1 & 1 básico), hay un problema: las imágenes que superan cierto tamaño de archivo no se pueden procesar. He movido todas las operaciones al sistema de archivos, para estar seguro de que no se trata de un problema POST latente. Aquí está el código correspondiente:imagecreatefromjpeg está terminando scripts silenciosamente


function cropAndResizeImage($imageLocation) 
{ 
    // 
    // Just to be certain 
    // 
    ini_set('display_errors','on'); 
    error_reporting(E_ALL); 
    ini_set('memory_limit','128M'); 
    ini_set('max_execution_time','300'); 

    $image_info = getimagesize($imageLocation); 
    $image_width = $image_info[0]; 
    $image_height = $image_info[1]; 
    $image_type = $image_info[2]; 

    switch ($image_type) 
    { 
    // snip... 
    case IMAGETYPE_JPEG: 
     $image = imagecreatefromjpeg($imageLocation); 
     break; 

    default: 
     break; 
    } 

    // snip... 
} 

El uso de mis poderes místicos de println depuración, he sido capaz de determinar que imagecreatefromjpeg no va a regresar; de hecho, el guión se detiene por completo cuando llega el momento. Algunos datos:

  • Esto está relacionado con el tamaño del archivo. Las imágenes de menos de 1 MB parecen estar bien (verificadas por puntos), pero las imágenes son de alrededor de 3 MB de barf. Sin embargo, no hay idea de cuál es el punto de corte preciso.
  • Esto no se debe a los tiempos de espera del servidor; wget devuelve en < 1s en imágenes de 3MB, significativamente más largas en imágenes "apropiadamente pequeñas" (lo que indica que no se procesan imágenes grandes).
  • La prefijación de la llamada de función con @ para suprimir errores no tiene ningún efecto. Esto concuerda bien con el hecho de que la secuencia de comandos no arroja un error, simplemente termina silenciosamente con esta llamada de función.

Si tuviera que adivinar, puede haber algún parámetro GD que no saber sobre (o tener acceso a) que limita el tamaño de los archivos de entrada en los servidores de 1 & de 1 — la configuración conjetura variable es debido a la hecho de que aparece inmediatamente, y no aparece (heurísticamente) para realizar una carga real o cálculos en la imagen.

¿Alguna sugerencia? Gracias por la ayuda.

actualización (cortesía @Darryl's comentarios): llamadas a phpinfo indican que PHP es la actualización de las variables max_execution_time y memory_limit correctamente. Esto no significa necesariamente que se están asignando estos recursos, simplemente que parecen funcionar como se esperaba.

Actualización 2: siguiendo algunas referencias de Google, traté de optimizar el JPEG (reducido en calidad de 3MB a 200KB) sin suerte, por lo que no es un problema de tamaño de archivo de imagen. Luego intenté reducir el número de píxeles de la imagen original 3888x2592, y el primer tamaño exitoso es 1400x2592 (1401x y 1402x ambos resultan en medio análisis y errores que indican "JPEG mal formado", lo cual no tiene mucho sentido a menos que la imagen completa no está siendo cargado). Al reducir aún más a 1300x2592, puedo crear una instancia de la imagen en miniatura de 400x300 que realmente estoy buscando; a 1400x2592, la llamada imagecreatetruecolor que estoy usando para encargarme de esa tarea falla silenciosamente de la misma manera que imagecreatefromjpeg.

En cuanto a por qué esto es, estoy un poco incierto. 1400 * 2592 == 3.5 MB no da nada particularmente significativo, pero tengo que imaginar que este es un límite en el número de píxeles que procesará GD + PHP.

Respuesta

1

Supongo que 1 & 1 no le permite cambiar las secuencias de comandos memory_limit o max_execution_time, por lo que probablemente se está quedando sin memoria. ¿Has intentado ejecutar phpinfo() para ver cuáles son los límites?

+0

Hey Darryl-- De hecho, me sorprendió descubrir esto, pero 1 & 1 * aparece * para permitir el ajuste de estos parámetros. Al menos, cuando los configuro y corro phpinfo(), todo aparece como se esperaba. ¿Es posible que tengan un sistema de aplicación secundario? – kyle

2

Consulte this note sobre el uso de memoria en el sitio web de php.

* "La memoria necesaria para cargar una imagen utilizando imagecreatefromjpeg() es una función de las dimensiones de la imagen y la profundidad de bits de las imágenes, multiplicada por una sobrecarga

Puede calculado a partir de esta fórmula:.

Num bytes = Ancho * Altura * Bytes por píxel * Factor de descarte aéreo "*

+0

Hola JC-- cuando baje la asignación de memoria a 1M y uso una imagen más pequeña, obtengo este error: " Error fatal: Se ha agotado el tamaño de memoria de 1048576 bytes (intenté asignar 4096 bytes) en/homepages/17/d203907073 /htdocs/dis/dev/inc/image.functions.php en la línea 98 "(... continúa ...) – kyle

+0

(... continúa ...) Porque el servidor está lanzando correctamente errores de" memoria insuficiente "en En este caso, supongo que es una causa diferente, ya que en mi caso no se producen errores. En cualquier caso, la imagen de 3MB tiene aproximadamente 3Kx3K píxeles, lo que se traduce en aproximadamente 70MB con factor alpha y 2x fudge factor. – kyle

Cuestiones relacionadas