¿Una forma segura de evitar que la biblioteca de imágenes GD se quede sin memoria? (PHP)

¿Hay alguna forma de evitar que la biblioteca de imágenes PHP GD se quede sin memoria? Si se carga una imagen demasiado grande, GD tiende a quedarse sin memoria, terminando el script. Me gustaría arrojar una excepción atrapable o algo así, pero no es así.

En este momento estoy usando un script ini_set('memory_limit', '128M') que primero emite un ini_set('memory_limit', '128M') , si eso funciona, generalmente estoy todo listo. Dependiendo de la configuración del servidor, eso puede no ser posible, así que estoy recurriendo a un algoritmo que intenta estimar la cantidad de memoria necesaria (teniendo en cuenta la resolución, la profundidad de color, los canales y un factor de caramelo), luego lo compara con memory_get_usage() si la función existe, de lo contrario hace una estimación aproximada.

Todo funciona hasta ahora, pero está lejos de ser elegante y, en algunos casos extremos, fallará, estoy seguro. ¿Hay alguna forma mejor de hacerlo, es decir, que GD falle con elegancia si es necesario, en lugar de detenerlo todo?

¡Compra más memoria! :-PAG

En serio, es imposible manejar la memoria insuficiente porque cualquier acción que realice requerirá más memoria.

Su mejor opción es limitar el tamaño de la imagen que se está cargando según la configuración de memoria actual.

Después de crear una imagen.

 imagepng($image); imagedestroy($image); 

eliminará el problema de memoria

Hay otra manera de hacerlo, pero puede llevar mucho tiempo, ya que ciertas partes del proceso de edición de imágenes se repetirían varias veces, pero puede establecer el límite de memoria a su valor estimado, luego intente procesar la imagen, si falla atrapa la excepción, aumente el límite de memoria, luego procese la imagen nuevamente, repita esto hasta que tenga éxito o scope un cierto límite de memoria, momento en el que lanzaría un mensaje de error al usuario explicando que su imagen es demasiado grande para ser utilizado.

Editar: Para detectar el error de falta de memoria, puede usar esta solución: http://au2.php.net/set_error_handler#35622

Su mejor opción es dejar de tratar de calcular cuánto RAM necesitará, y simplemente maximizarlo desde el principio: si tiene 4 GB disponibles, indique al script de imagen que use entre 2 y 4 GB más o menos, y cuando el El guión finaliza, que vuelva a la normalidad, que cubrirá todas las situaciones potencialmente fatales. Esa es la única manera “a prueba de fallas” que se me ocurre de todos modos …

Para detectar los errores fatales de PHP, como “Sin memoria” o “Error grave de PHP: Se ha agotado el tamaño de memoria permitido de 8388608 bytes (intentado asignar … bytes)”, consulte aquí: http://php.net/manual/en/ function.set-error-handler.php # 88401

Haga algunas pruebas para verificar cuánta memoria necesita cada función de gd .

  • imagecreatetruecolor parece necesitar width*height*5 bytes .

  • imagepng parece necesitar width*height*4 bytes .