71 votes

Quelle est la longueur maximale d'une chaîne de caractères en PHP ?

Alors, quelle taille peut avoir un $variable en PHP ? J'ai essayé de tester cela, mais je ne suis pas sûr d'avoir assez de mémoire système (~2 Go). Je pense qu'il doit y avoir une sorte de limite. Que se passe-t-il lorsqu'une chaîne de caractères devient trop grande ? Est-elle concaténée, ou PHP lève-t-il une exception ?

5 votes

Qu'est-ce que vous essayez de faire ?

0 votes

@sAc Je veux en savoir plus sur PHP. Je sais que je ne peux pas utiliser PHP pour des opérations gourmandes en mémoire en raison de graves fuites de mémoire.

1 votes

Dans php7, ils suppriment cette limitation : stackoverflow.com/a/31085071/1090562

102voto

Bill Karwin Points 204877

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

Note : Depuis PHP 7.0.0, il n'y a pas de restrictions particulières concernant la longueur d'une chaîne de caractères sur les versions 64 bits. Sur les versions 32 bits et les versions antérieures, une chaîne peut atteindre une taille de 2 Go (2147483647 octets maximum).

En PHP 5.x, les chaînes de caractères étaient limitées à 2 31 -1 octet, car le code interne a enregistré la longueur dans un entier signé de 32 bits.


Vous pouvez aspirer le contenu d'un fichier entier, en utilisant par exemple file_get_contents()

Cependant, un script PHP a une limite sur la mémoire totale qu'il peut allouer pour toutes les variables dans une exécution script donnée, donc cela place effectivement une limite sur la longueur d'une seule variable chaîne aussi.

Cette limite est la memory_limit dans le fichier de configuration php.ini. La limite de mémoire est fixée par défaut à 128 Mo dans PHP 5.2, et à 8 Mo dans les versions précédentes.

Si vous ne spécifiez pas de limite de mémoire dans votre fichier php.ini, il utilise la valeur par défaut, qui est compilée dans le binaire de PHP. En théorie, vous pouvez modifier les sources et reconstruire PHP pour changer cette valeur par défaut.

Si vous spécifiez -1 comme limite de mémoire dans votre fichier php.ini, il cesse de vérifier et permet à votre script d'utiliser autant de mémoire que le système d'exploitation en alloue. Cela reste une limite pratique, mais dépend des ressources et de l'architecture du système.


Re le commentaire de @c2 :

Voici un test :

<?php

// limit memory usage to 1MB 
ini_set('memory_limit', 1024*1024);

// initially, PHP seems to allocate 768KB for basic operation
printf("memory: %d\n",  memory_get_usage(true));

$str = str_repeat('a',  255*1024);
echo "Allocated string of 255KB\n";

// now we have allocated all of the 1MB of memory allowed
printf("memory: %d\n",  memory_get_usage(true));

// going over the limit causes a fatal error, so no output follows
$str = str_repeat('a',  256*1024);
echo "Allocated string of 256KB\n";
printf("memory: %d\n",  memory_get_usage(true));

0 votes

Quelle est donc la meilleure façon de respecter la limite de mémoire si nous avons vraiment besoin de longues chaînes de caractères ?

0 votes

Quand PHP.net déclare "La chaîne de caractères peut être aussi grande que 2GB". php.net/manual/fr/language.types.string.php Est-ce qu'ils veulent dire que ça peut aller sur 2 GO ?

0 votes

@Pacerier, bien vu ! Cette note ne figurait pas dans la page du manuel lorsque j'ai répondu à cette question pour la première fois en 2010. Je vais modifier ma réponse ci-dessus.

16voto

Touhid Rahman Points 768

La chaîne peut être aussi grande que 2GB.
Source :

12 votes

Et le développeur peut être licencié

4voto

c 2 Points 517

La longueur des chaînes de PHP est limitée par la façon dont elles sont représentées en PHP ; la mémoire n'a rien à voir avec cela.

Selon phpinternalsbook.com Comme les chaînes de caractères sont stockées dans la structure { char *val ; int len ; } et que la taille maximale d'un int en C est de 4 octets, cela limite effectivement la taille maximale des chaînes de caractères à 2 Go.

1 votes

Pourquoi diable n'utiliseraient-ils pas des int non signés ici ? Ce n'est pas comme si une chaîne de caractères pouvait être MOINS DE 0 BYTES DE LONG :p

1 votes

Le n'est pas tout à fait correct. 2 Go représentent 31 bits. Ils gaspillent un peu en utilisant un type de données signé. Peut-être que c'était pour simplifier des choses comme les contrôles de débordement sans exiger une valeur plus grande ou specif(concat A + B, uint total = A.len + B.len, if total > TYPE_MAX/2 then error), je ne pense pas que le C permette un contrôle de débordement sans passer par l'assemblage.

0 votes

@jgmjgm 2GB en 31bits c'est parce que le 32ème bit est pour le signe. Si cela avait été "unsinged int len", vous auriez eu 32 bits et 4 Go.

2voto

dsx724 Points 11

La longueur maximale d'une variable de type chaîne n'est que de 2GiB - (2^(32-1) bits). Les variables peuvent être adressées sur la base de caractères (8 bits/1 octet) et l'adressage est effectué par des entiers signés, ce qui explique la limite. Les tableaux peuvent contenir plusieurs variables qui suivent chacune la restriction précédente mais peuvent avoir une taille totale cumulée jusqu'à la limite de mémoire à laquelle une variable chaîne est également soumise.

0voto

animuson Points 23184

Non, la limite est basée sur la mémoire disponible de votre système. En gros, une fois que votre système est à court de mémoire, il ne peut plus ajouter de chaîne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X