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?
risposta
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));
Quindi qual è il modo migliore per lavorare all'interno del limite di memoria se abbiamo veramente bisogno di stringhe lunghe? – Pacerier
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
@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. –
Non c'è limite.
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.
.. perché f non userebbero unsigned int qui? non come una stringa può mai essere MENO DI 0 BYTES LONG: p – hanshenrik
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
@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
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.
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.
Forse 2^63 - 1? Non so nemmeno se tanta RAM sia disponibile da qualche parte ... – hakre
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
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
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.
- 1. Qual è la lunghezza massima di una stringa Python?
- 2. Qual è la lunghezza massima di una query di mongodb?
- 3. Qual è la lunghezza massima di una ListProperty?
- 4. Qual è la lunghezza massima di un nome DNS
- 5. Qual è la lunghezza massima possibile di una stringa di query?
- 6. Qual è la lunghezza massima degli sms concatenati in smpp?
- 7. Qual è la lunghezza massima di html testo
- 8. Lunghezza massima predefinita stringa xsd
- 9. Qual è la lunghezza massima dell'URL di Apache?
- 10. Qual è la lunghezza massima di latitudine e longitudine?
- 11. Qual è la lunghezza massima per un tipo di dati stringa in MongoDB utilizzato con Ruby?
- 12. Qual è la lunghezza di output di PHP crypt()?
- 13. Lunghezza massima di una variabile di stringa in Android
- 14. Qual è la lunghezza massima di un parametro stringa su Stored procedure?
- 15. Qual è la lunghezza di una stringa ID di sessione PHP?
- 16. Qual è la lunghezza massima di un SID in formato SDDL
- 17. Qual è la dimensione massima per un int in PHP?
- 18. Convalida ActiveRecord delle rotaie: lunghezza massima di una stringa?
- 19. Lunghezza massima della stringa di riga di comando
- 20. Qual è la lunghezza massima del comando da riga di comando di una finestra (cmd.exe)?
- 21. Lunghezza massima di una query SQL
- 22. Lunghezza massima di una fetta di Go
- 23. Qual è la lunghezza massima di una colonna nel file csv?
- 24. Qual è il subprocess.Popen lunghezza massima del parametro args?
- 25. Qual è la lunghezza in byte di una NSString?
- 26. Lunghezza massima identificatore
- 27. Qual è la lunghezza massima per un nome di attributo in python?
- 28. Qual è la lunghezza massima sicura di un segmento in un percorso URL dovrebbe essere?
- 29. Lunghezza massima password utente MySQL
- 30. Lunghezza massima del byte []?
cosa stai cercando di fare? – Sarfraz
@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
In php7 stanno rimuovendo questa limitazione: http://stackoverflow.com/a/31085071/1090562 –