関数のネスト。この名前は少し紛らわしく、理解するのが簡単ではないかもしれません。関数のネストのより一般的な特殊なケース: 再帰関数、つまり、それ自体をネストする関数。 PHP ではネストされた関数が多すぎるはずはないと常々思っていました。これは、私が過去のある時点で誤って再帰を使用したためです。つまり、再帰の深さが 100 に達すると、ネストされた関数の数が 100 に達すると、プログラムは致命的なエラーを報告します。以下の例:
コードをコピーします コードは次のとおりです:
function rt() {
static $i++, '
';
}
rt ();
die();
私の win7 + php5.3 環境で報告されたエラーは次のとおりです: 致命的なエラー: 関数の最大ネスト レベル '100' に達しました。これは PHP 自体の制限でしたが、ある日、liunx 環境に切り替えてコマンドライン モードで実行したところ、プログラムが無限ループに入っていることがわかりました。 環境が異なれば結果も異なるのはなぜでしょうか。ソース コード内のエラー情報を直接検索したところ、関連するコンテンツがないことがわかりました。実行プロセス全体を直接デバッグしましたが、win ではエラーは報告されませんでした。 どのような理由?再度勝利に切り替え、再度検索し、xdebug でエラー メッセージを見つけます。 xdebug.c ファイルの 1242 行目から開始します:
コードは次のとおりです: XG(level)++
if (XG(level) == XG(max_nesting_level)) {php_error(E_ERROR , "関数の最大ネスト レベル '%ld' に達しました。
中止します!", XG(max_nesting_level)); これは何を意味しますか?関数のネストのレイヤー数に関する以前の制限は、xdebug 拡張機能によって追加されました。なぜこの制限があるのですか? xdebug では、xdebug は、ネストされた関数呼び出し、関数呼び出し内のメモリ、時間、その他の値を含む各関数呼び出しを記録します。これらの値は、プログラムのパフォーマンスを分析する際に非常に役立ちます。この制限がないと、ネストされたレベルが多すぎると、マシンのメモリが不足してしまいます。 これが運用環境サーバーの場合、当然ながら、この拡張機能は運用環境には追加されません。ただし、この拡張機能は複数人が共有する開発サーバー上で利用できる場合があり、開発者のプログラムエラーによりマシンが利用できなくなり、開発者全員が作業できなくなる場合は、これが制限を追加する理由になるのではないかと思います。
この制限のレイヤー数を増やす必要がある場合はどうすればよいですか?ソース コードを変更して、xdebug 拡張機能を再コンパイルしますか?いいえ、xdebug 設定項目には xdebug.max_nesting_level という項目があります。デフォルトでは、この設定項目は php.ini でコメント化されています。コメントを削除して、この値を必要な値 200 に変更します。十分でない場合は 500 ですが、再帰が多すぎる場合は、プログラムのパフォーマンスに大きな影響を与えるため、この値を大きくしすぎないでください。現時点では、再帰を実装することをお勧めします。スタックの形式で使用するか、ループに置き換えます。フィボナッチ数列 (フィボナッチ) の実装では、ループを使用して実装する方が高速です。
結論: PHP 自体の関数のネストに制限はありません。制限があるとすれば、それはメモリの制限でもあります。これは、PHP の関数のネストがスタックの形式で実装されているためです。関数ごとに、関数のローカル コンテンツを保存するためにメモリのセクションが割り当てられます。
上記は、pptv クラック版 2013 unlimited PHP の関数ネスト層制限の分析を紹介しました。これには、pptv クラック版 2013 unlimited の内容も含まれており、PHP チュートリアルに興味のある友人に役立つことを願っています。