2009-03-21 9 views
5

Comme tant d'autres avant moi, j'écris un script PHP pour faire une image miniature. Le script a obtenu la certification WOMM (fonctionne sur ma machine), mais lorsque je la déplace vers mon hôte (1 & 1 Basic), il y a un problème: les images au-dessus d'une certaine taille de fichier ne peuvent pas être traitées. J'ai déplacé toutes les opérations vers le système de fichiers, pour être certain qu'il ne s'agit pas d'un problème latent POST. Voici le code correspondant:imagecreatefromjpeg met fin aux scripts en silence


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... 
} 

En utilisant mes pouvoirs mystiques de println le débogage, je suis en mesure de déterminer que imagecreatefromjpeg ne revient pas; en fait, le script s'arrête complètement quand il y arrive. Quelques faits:

  • Ceci est corrélé à la taille du fichier. Les images de moins de 1 Mo sembleraient correctes (spot-checked), mais les images autour de 3MB barf. Cependant, aucune idée de ce qu'est la coupure précise.
  • Ceci n'est pas dû aux délais d'attente du serveur; renvoie < 1s sur des images de 3 Mo, significativement plus long sur des images "de petite taille" (indiquant l'absence de traitement de grandes images).
  • Le préfixage de l'appel de fonction avec @ pour supprimer les erreurs n'a aucun effet. Cela correspond bien au fait que le script ne lance pas d'erreur, il se termine simplement silencieusement sur cet appel de fonction.

Si je devais deviner, il peut y avoir un paramètre de GD que je ne sais pas (ou avoir accès à) qui limite la taille des fichiers d'entrée sur les serveurs de 1 la conjecture variable de configuration est due à la fait qu'il barfs immédiatement, et n'apparaît pas (heuristiquement) pour effectuer un chargement réel ou des calculs sur l'image.

Des suggestions? Merci pour l'aide.

Mise à jour (avec la permission @Darryl's commentaires): appels à phpinfo indiquent que PHP est mise à jour correctement les variables max_execution_time et memory_limit. Cela ne signifie pas nécessairement que ces ressources sont allouées, mais simplement qu'elles semblent fonctionner comme prévu. Suite à quelques références de The Google, j'ai essayé d'optimiser le JPEG (qualité réduite de 3MB à 200KB) sans aucune chance, donc ce n'est pas un problème de taille d'image. J'ai ensuite essayé de réduire le nombre de pixels de l'image originale 3888x2592, et la première taille réussie est de 1400x2592 (1401x et 1402x entraînent des demi-analyses et des erreurs indiquant un "JPEG mal formé", ce qui n'a pas beaucoup de sens si l'image entière n'est pas en train d'être chargé). En réduisant encore à 1300x2592, je peux instancier l'image miniature de 400x300 que je cherche réellement; à 1400x2592, l'appel imagecreatetruecolor que j'utilise pour prendre en charge cette tâche échoue silencieusement de la même manière que imagecreatefromjpeg. Pour ce qui est de savoir pourquoi, je suis un peu incertain. 1400 * 2592 == 3.5MB ne donne rien de particulièrement significatif, mais je dois imaginer que c'est une limite sur le nombre de pixels que traitera GD + PHP.

Répondre

1

Je devine que 1 & 1 ne vous permet pas de modifier les scripts memory_limit ou max_execution_time, il est donc probablement à court de mémoire. Avez-vous essayé d'exécuter phpinfo() pour voir quelles sont les limites?

+0

Hey Darryl-- J'ai été vraiment surpris de comprendre cela, mais 1 & 1 * apparaît * pour permettre le réglage de ces paramètres. Au moins, quand je les mets et exécute phpinfo(), tout se présente comme prévu. Est-il possible qu'ils aient un système d'application secondaire? – kyle

2

Veuillez voir this note concernant l'utilisation de la mémoire sur le site Web php.

* "La mémoire requise pour charger une image en utilisant imagecreatefromjpeg() est une fonction des dimensions de l'image et la profondeur de bits de l'image, multipliée par le coefficient d'un rétroprojecteur

On peut calculer à partir de la formule suivante:.

Nombre d'octets = Largeur * Hauteur * Octets par pixel * Fudge facteur de surcharge "*

+0

Salut JC-- lorsque j'abaisse l'allocation de mémoire à 1M et utilise une image plus petite, j'obtiens cette erreur: " Erreur fatale: Taille de la mémoire autorisée de 1048576 octets épuisés (essayé d'allouer 4096 octets) dans/homepages/17/d203907073 /htdocs/dis/dev/inc/image.functions.php on line 98 "(... suite ...) – kyle

+0

(... suite ...) Parce que le serveur lance correctement les erreurs" out of memory "dans Dans ce cas, je suppose que c'est une cause différente, car dans mon cas, aucune erreur n'est levée. En tout cas, l'image de 3 Mo est à peu près 3Kx3K pixels, ce qui se traduit par environ 70 Mo avec alpha et 2x facteur de fudge. – kyle