PHPはphp.iniファイルを解析しますか?


24

RHEL 7.7でPHPバージョン7.1.30を実行します。

memory_limitを増やしたいのですが、構文が正しいかどうか(256Mまたは256MBなど)がわかりませんでした。まず、memory_limit設定に不適切な値「Hugo」を入れます。これの問題は、phpinfo()(httpdで実行)の結果であり、文字列「Hugo」が適切に配置されています。

ここに画像の説明を入力してください

そのため、PHPが実際に値の健全性チェックを行わないことに少し心配しています。(提供された値が悪かった場合、私はそれがデフォルトに戻ると期待します、例えば)

誰もがこれについてコメントできますか?特に、PHPが物事を強制するかどうかをどのようにして知ることができますか(任意の文字列を提供できる場合)。


4
すばらしい質問です。
ティンク

3
これから:php.net/manual/en/faq.using.php#faq.using.shorthandbytes私はそれがと同じだと思い(int) 'HUGO'; // => 0ます。私のマシンでは2MBのメモリを使用すると失敗します。
ヨシ

レコードの場合、正しい構文はmemory_limit 256Mです。
Tigger

@よし答えは公開すべきだと思います。それは良い説明です
Maksym Fedorov

@MaksymFedorov私は自分の仮定に実際の参照がないので、私はためらっています。今のところ、それは単なる観察です。
ヨシ

回答:


19

ここで混乱するのは、設定が特別な構文を持つ整数のように見えますが、内部的に文字列として定義されていることです。次に、値が変更されるたびに、文字列が個別のグローバル変数に解析されます。重要なことに、文字列を整数に解析した結果は設定テーブルに保存されないため、を呼び出すとphpinfo()、解析された値ではなく、元の入力が表示されます。

これはソースで見ることができます:

サポートされる構文は、最終的にで定義されますzend_atol

  1. 追加のテキストを無視して、文字列を数値で解析します
  2. 文字列の最後の文字を見て、乗算前の値それがある場合はgGmMk、またはK

先頭に数字がない値は、ゼロとして解析されます。グローバル変数を設定するとき、これは定数に基づいて、メモリ制限を許容される最小値に設定しますZEND_MM_CHUNK_SIZE

メモリ制限を設定し、大量のメモリをすばやく割り当てるループを実行して、エラーメッセージで何が出力されるかを確認することで、効果を確認できます。例えば:

# 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

すばらしい評価をありがとう@IMSoP この種のことをバグトラッカーで報告すべきでしょうか?phpinfo()が非常に直感に反する応答を見つけます。また、予期しない値が発生したときにphpが実行するデバッグ出力の一部も、見逃すことはありません。
ティンク

1
@tink機能のリクエストをbugs.php.netで行うか、ほとんどの調整が行われるInternalsメーリングリストにメッセージを送信できると思います。数年前から似たようなリクエストを見つけましが、何の反応もないようです。
IMSoP

もう一度ありがとうございます。:)
ティンク

0

まず最初に、PHP.iniが解釈ワークフローの方法でどのように機能するかを最初に理解する必要があります。memory_limitはPHPのディレクティブです。

PHP関数で使用する場合は、次のようにする必要があります ini_set(‘memory_limit’,’256MB’)。したがって、この関数は一時的に値をインタープリター変数に設定します。よく見ると、1つはローカル用、もう1つはグローバル用の2つの列を取得できます。それは、それぞれの個人に対する価値観の能力を示しています。

ただし、グローバルに対して定義した場合は、それぞれK、M、Gのサフィックスとして設定する必要があります。apache .htaccessを使用してこの値を超える場合、PHP fpmでも同じ値が必要です。


3
OPがメモリ制限を設定する方法を尋ねていないことを親切に指摘したいと思います:)
Karolis
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.