2010-07-06 12 views
59

Quindi, quanto può essere grande un $variable in PHP? Ho provato a testarlo, ma non sono sicuro di avere abbastanza memoria di sistema (~ 2gb). Immagino ci debba essere una sorta di limite. Cosa succede quando una stringa diventa troppo grande? È concatenato o PHP lancia un'eccezione?Qual è la lunghezza massima di una stringa in PHP?

+5

cosa stai cercando di fare? – Sarfraz

+0

@sAc Voglio saperne di più su PHP. So che non posso usare php per operazioni pesanti di memoria a causa di gravi perdite di memoria. – rook

+1

In php7 stanno rimuovendo questa limitazione: http://stackoverflow.com/a/31085071/1090562 –

risposta

88

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

Nota: Dal PHP 7.0.0, non ci sono particolari restrizioni per quanto riguarda la lunghezza di una stringa a 64 bit costruisce. Da 32-bit costruisce e nelle versioni precedenti, una stringa può essere grande quanto fino a 2GB (2147483647 byte massimo)

In PHP 5.x, stringhe erano limitati a 2 -1 byte, perché il codice interno ha registrato la lunghezza in un numero intero a 32 bit con segno.


È possibile trangugiare nel contenuto di un intero file, per esempio utilizzando file_get_contents()

Tuttavia, uno script PHP ha un limite sulla memoria totale può allocare per tutte le variabili in un dato esecuzione dello script, quindi questo pone anche un limite alla lunghezza di una singola variabile di stringa.

Questo limite è la direttiva memory_limit nel file di configurazione php.ini. Il limite di memoria predefinito è 128 MB in PHP 5.2 e 8 MB nelle versioni precedenti.

Se non si specifica un limite di memoria nel file php.ini, viene utilizzato il valore predefinito, che viene compilato nel file binario di PHP. In teoria è possibile modificare l'origine e ricostruire PHP per modificare questo valore predefinito.

Se si specifica -1 come limite di memoria nel file php.ini, il controllo si interrompe e consente allo script di utilizzare la quantità di memoria che verrà allocata dal sistema operativo. Questo è ancora un limite pratico, ma dipende dalle risorse di sistema e dall'architettura.


Re commento da @ c2:

Ecco 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

Quindi qual è il modo migliore per lavorare all'interno del limite di memoria se abbiamo veramente bisogno di stringhe lunghe? – Pacerier

+0

Quando PHP.net afferma "La stringa di note può essere grande come 2 GB". http://php.net/manual/en/language.types.string.php significano che può andare * oltre * 2 GB? – Pacerier

+0

@Pacerier, buona presa! Quella nota non era nella pagina di manuale quando ho risposto per prima a questa domanda nel 2010. Modificherò la mia risposta sopra. –

16

String può essere grande come 2GB.
Source

+7

E lo sviluppatore può essere licenziato – James

4

lunghezza di stringa PHP è limitata dal modo in cui le stringhe sono rappresentate in PHP; la memoria non ha nulla a che fare con questo.

Secondo phpinternalsbook.com, le stringhe sono memorizzate in struct {char * val; int len; } e poiché la dimensione massima di un int in C è di 4 byte, ciò limita in modo efficace la dimensione massima della stringa a 2 GB.

+1

.. perché f non userebbero unsigned int qui? non come una stringa può mai essere MENO DI 0 BYTES LONG: p – hanshenrik

+1

Il non è del tutto corretto. 2 GB sono 31 bit. Sprecano un po 'usando un datatype firmato.Forse questo era per semplificare cose come i controlli di overflow senza richiedere un valore più grande o specifica (concat A + B, uint total = A.len + B.len, se totale> TYPE_MAX/2 quindi errore), non credo C consente un controllo di troppopieno senza cadere nell'assemblaggio. – jgmjgm

+0

@jgmjgm 2 GB in 31 bit perché il 32 ° bit è per il segno. Se fosse stato "int len ​​unsinged" allora avresti 32 bit e 4 GB – Jack

2

La lunghezza massima di una variabile di stringa è solo 2GiB - (2^(32-1) bit). Le variabili possono essere indirizzate su una base di carattere (8 bit/1 byte) e l'indirizzamento viene eseguito da interi con segno, motivo per cui il limite è quello che è. Le matrici possono contenere più variabili che seguono ciascuna la restrizione precedente ma possono avere una dimensione cumulativa totale fino a memory_limit di cui anche una variabile stringa è soggetta.

2

In un nuovo imminente php7 tra le molte altre caratteristiche, hanno aggiunto un supporto per strings bigger than 2^31 bytes:

Supporto per stringhe con lunghezza> = 2^31 byte a 64 bit costruisce.

Purtroppo non hanno specificato quanto più grande può essere.

+0

Forse 2^63 - 1? Non so nemmeno se tanta RAM sia disponibile da qualche parte ... – hakre

+0

In teoria potrebbe consentire 2^32 o 2^64. Per qualsiasi motivo, vengono utilizzati valori scritti o lunghi. Perché questo potrebbe infrangere il codice in molti punti (se len jgmjgm

+0

Scommetto il suo 0x7FFFFFFFFFFFFFFF o 9223372036854775807 byte (o 9.2 exabyts), meno quello che PHP sta già usando, meno qualsiasi ASLR sta sprecando, perché, lo sai, lo spazio di memoria virtuale a 64 bit sarebbe esaurito: D – hanshenrik

0

Per rispondere correttamente a questa esigenza è necessario considerare gli interni di PHP o il target per cui PHP è stato progettato.

Per rispondere a questo da una prospettiva tipica Linux su x86 ...

Dimensioni dei tipi in C: https://usrmisc.wordpress.com/2012/12/27/integer-sizes-in-c-on-32-bit-and-64-bit-linux/

Tipi utilizzati in PHP per le variabili: http://php.net/manual/en/internals2.variables.intro.php

Le stringhe sono sempre 2GB poiché la lunghezza è sempre 32 bit e un po 'viene sprecato perché usa int piuttosto che uint. int non è pratico per lunghezze superiori a 2 GB in quanto richiede un cast per evitare di rompere i confronti aritmetici o "che". È probabile che il bit in più venga utilizzato per i controlli di overflow.

Stranamente, le chiavi di hash potrebbero supportare internamente 4 GB come uint è usato anche se non l'ho mai messo alla prova. Le chiavi hash PHP hanno un +1 alla lunghezza per un byte null finale che a mia conoscenza viene ignorato, quindi potrebbe essere necessario non firmare per quel caso limite piuttosto che consentire chiavi più lunghe.

Un sistema a 32 bit può imporre ulteriori limiti esterni.

Problemi correlati