PHP php.ini dosyasında ayrıştırma yapıyor mu?


24

RHEL 7.7 altında PHP 7.1.30 sürümünü çalıştırıyor.

Ben memory_limit çarpmak istiyorum, ama sözdizimi doğru (yani 256M veya 256MB) vardı emin değildi. Yani başlamak için ben memory_limit ayarı olarak kötü bir değer "Hugo" koymak. Bu sorun phpinfo () (httpd altında çalıştırın) sonucu tam anlamıyla yerinde "Hugo" vardır, yani:

resim açıklamasını buraya girin

Yani bu beni PHP aslında değer (ler) için herhangi bir akıl sağlığı kontrol yapmaz endişe var. (Sağlanan değer kötüyse, varsayılana dönmesini beklerim, örneğin)

Herkes bu konuda yorum yapabilir miyim - özellikle, PHP şeyler zorlamak olup olmadığını nasıl biliyorsun (bir arbitary string sağlanabilirse).


4
Mükemmel soru.
tink

3
Bundan: php.net/manual/tr/faq.using.php#faq.using.shorthandbytes Ben onunla aynı olduğunu varsayardım (int) 'HUGO'; // => 0. Hangi kullanılan bellekte 2MB makinemde başarısız olmaya başlar.
Yoshi


@Yoshi Sanırım cevabını herkese açık hale getirmelisin. İyi bir açıklama
Maksym Fedorov

@MaksymFedorov Varsayımım için gerçek bir referansım olmadığı için tereddüt ediyorum. Şimdilik bu sadece bir gözlem.
Yoshi

Yanıtlar:


19

Burada kafa karıştırıcı olan şey, ayarın bazı özel sözdizimiyle bir tamsayı gibi görünmesi, ancak dahili olarak bir dize olarak tanımlanmasıdır. Daha sonra değer her değiştiğinde dize ayrı bir genel değişkene ayrıştırılır . Çok önemli bir şekilde, dizeyi bir tamsayıya ayrıştırma sonucu tekrar ayarlar tablosuna kaydedilmez, bu nedenle aradığınızda phpinfo(), ayrıştırılan değeri değil orijinal girdiyi görürsünüz.

Bunu kaynakta görebilirsiniz:

Desteklenen sözdizimi nihayetinde tanımlanır zend_atol:

  1. ek metni yoksayarak dizeyi sayısal bir değer için ayrıştırır
  2. dizesinin son karaktere bakar ve çarpar önceki değeri ise g, G, m, M, k, veyaK

Başlangıçta rakam içermeyen bir değer sıfır olarak ayrıştırılır. Global değişkeni ayarlarken, bu, bellek sınırını sabite bağlı olarak izin verilen minimum değere ayarlar ZEND_MM_CHUNK_SIZE.

Bellek sınırını ayarladıktan sonra hızlı bir şekilde büyük miktarda bellek ayıran ve hata mesajında ​​ne olduğunu görerek bir döngü çalıştırarak efekti görebilirsiniz. Örneğin:

# Invalid string; sets to compiled minimum
php -r 'ini_set("memory_limit", "HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 2097152 bytes exhausted

# Number followed by a string; takes the number
php -r 'ini_set("memory_limit", "4000000 HUGO"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4000000 bytes exhausted

# Number followed by a string, but ending in one of the recognised suffixes
# This finds both the number and the suffix, so is equivalent to "4M", i.e. 4MiB
php -r 'ini_set("memory_limit", "4 HUGO M"); while(true) $a[]=$a;'
# -> PHP Fatal error:  Allowed memory size of 4194304 bytes exhausted

Bu harika değerlendirme için @ IMSoP'a teşekkür ederiz. Bu tür bir şeyi herhangi bir hata takipçisinde rapor etmeli mi? Ben phpinfo () yüksek karşı-sezgisel üreten yanıt buluyorum. Ve php beklenmedik değerlerle karşılaştığında ne için bazı hata ayıklama çıktı da yanlış gitmek olmaz.
Ocak'ta

1
@tink Sana bir özellik isteği zam sanırım bugs.php.net veya mesaj göndermek Içselleri posta listesine en koordinasyon olur yerdir. Birkaç yıl önce benzer bir istek buldum , ancak herhangi bir yanıt almamış gibi görünüyor.
IMSoP

Tekrar teşekkürler, buna bakacağız! :)
tink

0

Öncelikle, PHP.ini'nin yorum akışı iş akışında nasıl çalıştığını anlamamız gerekir. memory_limit PHP için direktiflerdir.

PHP işlevi ile kullanırken böyle bir şey yapmak zorunda ini_set(‘memory_limit’,’256MB’). Bu nedenle, bu işlev geçici olarak değerinizi yorumlayıcı değişkenine ayarlayacaktır. Daha yakından görürseniz, One için Local ve One için global olmak üzere iki sütun alabilirsiniz. Bu, değerlerin sırasıyla bireye olan yeteneğini gösterir.

Ancak, global için tanımladığınızda, sırasıyla K, M, G ile bir sonek olarak ayarlamanız gerekir. Apache .htaccess kullanarak bu değeri aşarsak PHP fpm için aynı değeri gerektirir.


3
Nazikçe OP'nin bellek sınırını nasıl ayarlayacağını sormadığını belirtmek isterim :)
Karolis
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.