¿Cuál es la longitud máxima de una cadena en PHP?

Entonces, ¿qué tan grande puede obtener una $variable en PHP? Intenté probar esto, pero no estoy seguro de tener suficiente memoria del sistema (~ 2 gb). Me imagino que tiene que haber algún tipo de límite. ¿Qué sucede cuando una cuerda se hace demasiado grande? ¿Está concatenado, o PHP lanza una excepción?

http://php.net/manual/en/language.types.string.php dice:

Nota: A partir de PHP 7.0.0, no hay restricciones particulares con respecto a la longitud de una cadena en comstackciones de 64 bits. En comstackciones de 32 bits y en versiones anteriores, una cadena puede ser tan grande como hasta 2 GB (2147483647 bytes máximo)

En PHP 5.x, las cadenas estaban limitadas a 2 31 -1 bytes, porque el código interno registraba la longitud en un entero de 32 bits con signo.


Puede sorber el contenido de un archivo completo, por ejemplo, usando file_get_contents()

Sin embargo, un script PHP tiene un límite en la memoria total que puede asignar a todas las variables en una ejecución de script determinada, por lo que esto también limita la longitud de una variable de cadena.

Este límite es la directiva memory_limit en el archivo de configuración php.ini. El límite de memoria predeterminado es 128 MB en PHP 5.2 y 8 MB en versiones anteriores.

Si no especifica un límite de memoria en su archivo php.ini, usa el predeterminado, que se comstack en el binario de PHP. En teoría, puede modificar el origen y reconstruir PHP para cambiar este valor predeterminado.

Si especifica -1 como límite de memoria en su archivo php.ini, deja de verificarse y permite que su script use tanta memoria como el sistema operativo asignará. Este sigue siendo un límite práctico, pero depende de los recursos del sistema y la architecture.


Comentario de @ c2:

Aquí hay una prueba:

  

La cadena puede ser tan grande como 2GB.
Fuente

La longitud de la cadena de PHP está limitada por la forma en que las cadenas se representan en PHP; la memoria no tiene nada que ver con eso.

De acuerdo con phpinternalsbook.com , las cadenas se almacenan en struct {char * val; int len; } y dado que el tamaño máximo de un int en C es de 4 bytes, esto efectivamente limita el tamaño máximo de cadena a 2 GB.

En un nuevo php7 próximo entre muchas otras características, agregaron un soporte para cadenas de más de 2 ^ 31 bytes :

Soporte para cadenas con longitud> = 2 ^ 31 bytes en comstackciones de 64 bits.

Lamentablemente, no especificaron cuánto más grande puede ser.

La longitud máxima de una variable de cadena es solo 2GiB – (2 ^ (32-1) bits). Las variables pueden abordarse en base a caracteres (8 bits / 1 byte) y el direccionamiento se realiza mediante enteros con signo, razón por la cual el límite es lo que es. Las matrices pueden contener múltiples variables, cada una de las cuales sigue la restricción anterior, pero puede tener un tamaño acumulativo total hasta memory_limit al que también está sujeta una variable de cadena.

Para responder correctamente a esta pregunta, debe considerar las funciones internas de PHP o el objective para el que está diseñado PHP.

Para responder a esto desde una perspectiva típica de Linux en x86 …

Tamaños de tipos en C: https://usrmisc.wordpress.com/2012/12/27/integer-sizes-in-c-on-32-bit-and-64-bit-linux/

Tipos utilizados en PHP para variables: http://php.net/manual/en/internals2.variables.intro.php

Las cadenas son siempre de 2 GB, ya que la longitud es siempre de 32 bits y se desperdicia un poco porque usa int en lugar de uint. int no es práctico para longitudes superiores a 2 GB, ya que requiere un molde para evitar romper comparaciones aritméticas o “que”. Es probable que el bit adicional se esté utilizando para comprobaciones de desbordamiento.

Extrañamente, las claves hash pueden ser compatibles internamente con 4 GB cuando se usa uint, aunque nunca lo puse a prueba. Las claves PHP hash tienen un +1 a la longitud de un byte nulo posterior que, según mi conocimiento, se ignora, por lo que puede que no se tenga que firmar para ese caso límite en lugar de permitir claves más largas.

Un sistema de 32 bits puede imponer más límites externos.