Ejecutando PHP Versión 7.1.30 bajo RHEL 7.7.
Estoy deseando aumentar memory_limit, pero no estaba seguro de tener la sintaxis correcta (es decir, 256M o 256MB). Entonces, para empezar, puse un mal valor "Hugo" como la configuración de memory_limit. El problema con esto es el resultado de que phpinfo () (ejecutado bajo httpd) literalmente tiene la cadena "Hugo" en su lugar, es decir:
Entonces, esto me tiene un tanto preocupado de que PHP en realidad no haga ninguna comprobación de cordura para los valores. (Si el valor proporcionado era malo, esperaría que volviera a un valor predeterminado, por ejemplo)
¿Alguien puede comentar sobre esto? En particular, ¿cómo saber si PHP hará cumplir las cosas (si se puede proporcionar una cadena arbitraria)?
(int) 'HUGO'; // => 0
. Que comienza a fallar en mi máquina con 2 MB de memoria utilizada.memory_limit 256M
.Respuestas:
Lo confuso aquí es que la configuración parece un número entero con alguna sintaxis especial, pero se define internamente como una cadena. La cadena se analiza luego en una variable global separada cada vez que se cambia el valor. Crucialmente, el resultado de analizar la cadena a un entero no se guarda de nuevo en la tabla de configuración, por lo que cuando llama
phpinfo()
, ve la entrada original, no el valor analizado.Puedes ver esto en la fuente:
zend_atol
, que maneja los sufijos especialesLa sintaxis compatible se define en última instancia en
zend_atol
, que:g
,G
,m
,M
,k
, oK
Un valor sin dígitos al inicio se analizará como cero. Al configurar la variable global, esto establecerá el límite de memoria al mínimo permitido, en función de la constante
ZEND_MM_CHUNK_SIZE
.Puede ver el efecto configurando el límite de memoria, luego ejecutando un bucle que asigna rápidamente una gran cantidad de memoria y viendo lo que sale en el mensaje de error. Por ejemplo:
fuente
Lo primero es lo primero, primero tenemos que entender cómo funciona PHP.ini en la forma de flujo de trabajo de interpretación. memory_limit es directivas para PHP.
cuando se usa con la función PHP, debe hacer algo como esto
ini_set(‘memory_limit’,’256MB’)
. Por lo tanto, esta función establecerá temporalmente su valor en la variable intérprete. Si ve más de cerca, puede obtener las dos columnas Una es para Local y otra para global. Eso muestra la capacidad de los valores para el individuo respectivamente.Pero, cuando definió global, debe establecerlo como un sufijo con K, M, G, respectivamente. Si excedemos este valor usando apache .htaccess, se requiere lo mismo para PHP fpm.
fuente