PHPでは、 INI_SET()関数を使用して、PHP構成設定を動的に変更します。その目的は、実行時にPHPのPHP.ini構成ファイルの特定の値を変更して、必要に応じてPHP環境の動作を調整することです。ただし、場合によっては、 ini_set()関数を使用して構成設定にもかかわらず、最終的な構成値は他の設定によって上書きされることがわかります。この状況は、予想される動作が実際の結果と矛盾し、開発の問題を引き起こす可能性があります。この記事では、この現象の一般的な原因を調査し、この問題を回避するためのいくつかの解決策を提供します。
PHP構成ファイルPHP.iniは、最初にロードされた構成ソースであり、通常、デフォルトの環境変数と構成値を設定します。 INI_SET()を使用して実行時に一部の構成を変更できますが、一部の構成アイテムは、ランタイムの変更よりも優先度が高いです。たとえば、 php.iniの構成値は、ini_set()の後にリロードされると動的設定を上書きします。
さらに、一部のPHP構成アイテムの変更許可は、PHPセキュリティモードまたはオペレーティングシステムの許可の影響も受けます。このような環境では、 ini_set()が無効になる可能性があり、特定の構成アイテムを動的に変更することはできません。
PHPがSafe_ModeまたはOpen_Basedirの制限を有効にするように構成されている場合、一部の機密構成アイテム(ファイルアクセス、パス設定など)は、システム環境によって制御されることを余儀なくされます。これは、ini_set()がこれらの値を変更できないか、変更された値がオペレーティングシステムのセキュリティポリシーによって上書きされることを意味します。
PHPがApacheサーバーを介して実行されている場合、一部の構成アイテムは、 .htaccessやhttpd.confなどのApacheの構成ファイルを介して調整できます。これらの構成ファイルは、ini_set()によって行われた変更をオーバーライドできます。たとえば、一部のPHP設定が.htaccessファイルで変更されている場合、これらの設定はApacheが起動するときに有効になり、 ini_set()を介して実行時に変更された変更を上書きします。
FastCGIまたはPHP-FPM(FastCGI Process Manager)を介して実行されるPHPプログラムの場合、PHP構成は通常、 PHP-FPM.CONFやwww.confなどの構成ファイルによって管理されます。これらのファイルで特定の構成項目が指定されている場合、コードでini_set()を使用して変更された場合でも、リクエストの先頭にFPM構成によって上書きされる場合があります。
特定のPHP拡張機能(Opcache、Memcached、Xdebugなど)は、PHPスクリプトの実行中に構成項目に影響または上書きする可能性があります。これは、拡張機能がPHP起動時に初期化され、 ini_set()によって設定された構成値をオーバーライドする可能性があるためです。したがって、拡張機能が構成アイテムで動作する場合、 ini_set()の設定が上書きされる場合があります。
PHP構成を適切な場所に設定してください。たとえば、PHPがApacheを介して実行されている場合、コードを介して動的に設定するのではなく、 .htaccessまたはhttpd.confに関連する構成を設定することが推奨されます。 PHP-FPMを使用している場合は、 PHP-FPM.CONFを介して対応する構成オプションを必ず設定してください。
ini_set()によって変更された構成アイテムを実行時に動的に調整できることを確認してください。一部の構成アイテムは、 php_ini_systemまたはphp_ini_perdirに設定される場合があり、これらのアイテムは正しい環境で変更する必要があります。 phpinfo()を使用して、各構成アイテムの権限と読み込み順序を表示して、ini_set()で変更できるアイテムを決定できます。
一部の構成アイテムの場合、特にこれらの設定がサーバーレベルで有効であることを確認する必要がある場合、 ini_set()の使用が適切ではない場合があります。いくつかの重要な構成項目( max_execution_time 、 memory_limitなど)の場合、コマンドラインを介してPHPを開始するときにphp.iniを直接変更するか、対応するパラメーターを通過することを検討できます。これにより、動的設定が実行時に上書きされないようにします。
構成アイテムの値に影響を与えるPHP拡張機能が発生した場合、拡張機能を無効にするか、拡張機能の構成を確認して、関連する構成アイテムを不要に上書きしないことを確認できます。たとえば、Opcacheを使用する場合、 OpCache構成がINI_SET()の値を妨げたり、不要な拡張機能を無効にしないことを確認できます。
あなたが経験しているオーバーライドの問題がFastCGIまたはPHP-FPM環境で発生する場合、PHP-FPM構成ファイルを確認し、環境変数が正しく設定されていることを確認することをお勧めします。また、 PHPINFO()を介してランタイム環境の構成を確認して、スタートアップで正しい設定が渡されることを確認することもできます。
合理的な構成管理により、PHP開発者は、他の設定によって上書きされる構成アイテムの問題を回避できます。 ini_set()は、実行時に動的な構成の変更を可能にする非常に便利なツールですが、いくつかの制限もあります。 PHP構成、ランタイム環境の介入、およびその他のセットアップファイルの優先順位を理解することで、開発者がPHP環境の動作をよりよく制御し、それによりプログラムの安定性と保守性を向上させることができます。