Uruchamianie PHP w wersji 7.1.30 pod RHEL 7.7.
Chcę podnieść limit pamięci, ale nie byłem pewien, czy mam poprawną składnię (tj. 256 MB lub 256 MB). Na początek wstawiłem złą wartość „Hugo” jako ustawienie memory_limit. Problem polega na tym, że phpinfo () (działający pod httpd) dosłownie ma łańcuch „Hugo” na swoim miejscu, tj .:
To mnie trochę martwi, że PHP tak naprawdę nie sprawdza poprawności wartości. (Jeśli podana wartość była zła, oczekiwałbym, że przywróci wartość domyślną, np.)
Czy ktoś może komentować na ten temat - w szczególności, skąd wiesz, czy PHP będzie wymuszać różne rzeczy (jeśli można podać dowolny ciąg znaków).
(int) 'HUGO'; // => 0
. Który zaczyna się nie powieść na moim komputerze przy 2 MB użytej pamięci.memory_limit 256M
.Odpowiedzi:
Mylące jest tutaj to, że ustawienie wygląda jak liczba całkowita ze specjalną składnią, ale jest wewnętrznie zdefiniowane jako ciąg. Ciąg jest następnie analizowany w oddzielnej zmiennej globalnej za każdym razem, gdy wartość jest zmieniana. Co najważniejsze, wynik parsowania ciągu na liczbę całkowitą nie jest zapisywany z powrotem w tabeli ustawień, więc po wywołaniu
phpinfo()
zobaczysz oryginalne wejście, a nie przeanalizowaną wartość.Możesz to zobaczyć w źródle:
zend_atol
, która obsługuje specjalne sufiksyObsługiwana składnia jest ostatecznie zdefiniowana w
zend_atol
:g
,G
,m
,M
,k
, lubK
Wartość bez cyfr na początku zostanie przeanalizowana jako zero. Podczas ustawiania zmiennej globalnej ustawi to limit pamięci na minimum dozwolone, w oparciu o stałą
ZEND_MM_CHUNK_SIZE
.Możesz zobaczyć efekt, ustawiając limit pamięci, a następnie uruchamiając pętlę, która szybko przydziela dużą ilość pamięci i sprawdzając, co pojawia się w komunikacie o błędzie. Na przykład:
źródło
Po pierwsze, najpierw musimy zrozumieć, jak działa PHP.ini w przepływie pracy interpretacji. memory_limit to wytyczne dla PHP.
używając funkcji PHP musisz zrobić coś takiego
ini_set(‘memory_limit’,’256MB’)
. Ta funkcja tymczasowo ustawi wartość na zmienną interpretera. Jeśli przyjrzysz się bliżej, możesz uzyskać dwie kolumny. Jedna jest lokalna, a druga globalna. To pokazuje zdolność wartości odpowiednio do jednostki.Ale jeśli zdefiniowałeś dla globalnego, musisz ustawić jako przyrostek odpowiednio K, M, G. Jeśli przekroczymy tę wartość za pomocą apache .htaccess, wymaga to tego samego dla PHP fpm.
źródło