RitoLabo

PHP 8.0 の設定ファイル php.ini-development と php.ini-production の違い

  • 公開:
  • カテゴリ: PHP Basics
  • タグ: PHP,php_ini

PHP には php.ini という設定ファイルがありますが、これを作成する元となる設定ファイルには本番用と開発用の2つが存在しています。

今回はこの2つの php.ini の違いを見ていきたいと思います。

アジェンダ
  1. 環境
  2. php.ini
  3. 本番用と開発用の php.ini
  4. php.ini-development と php.ini-production の違い
    1. zend.exception_ignore_args
    2. zend.exception_string_param_max_len
    3. error_reporting
    4. display_errors
    5. display_startup_errors
    6. mysqlnd.collect_memory_statistics
    7. zend.assertions
    8. opcache.huge_code_pages

環境

PHP 8.0 の環境で見ていきます。

$ php  -v
PHP 8.0.0 (cli) (built: Dec 17 2020 08:54:56) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies

php.ini

php.ini は PHP の設定ファイルの事で、PHP の動作に関する様々な設定をここに記述することができます。

設定ファイル
https://www.php.net/manual/ja/configuration.file.php

php.ini がどこに設置されているのかは以下のコマンドを叩くと確認する事ができます。(環境によって設置箇所は異なります)

# php.ini の場所を確認する
php --ini

# 実行結果
$ php --ini
Configuration File (php.ini) Path: /usr/local/etc/php
Loaded Configuration File: /usr/local/etc/php/php.ini
Scan for additional .ini files in: /usr/local/etc/php/conf.d

本番用と開発用の php.ini

php.ini が設置されているディレクトリに php.ini-developmentphp.ini-production が存在しています。

/usr/local/etc/php
├── conf.d
├── php.ini
├──
php.ini-development
└──
php.ini-production

この2つのファイルを基に php.ini を作成するわけですが、これらのファイルについて、具体的にどこの設定項目がどう違うのでしょうか。

その違いを見ていきます。

余談ですが php.ini が無い場合はその項目ごとにデフォルト値が決まっていて、デフォルト値が適用されます

php.ini-development と php.ini-production の違い

2つのファイルの差分を取り、設定の違いを確認していきます。

php.ini-developmentとphp.ini-productionの差分

zend.exception_ignore_args

例外用に生成されたスタックトレースに引数を含めるかどうかの設定。

  • 本番環境ではこの設定をオンにしてスタックトレースで機密情報を出力しないようにすることが推奨されている。
  • デフォルト:Off
  • 開発用:Off
  • 本番用:On
-zend.exception_ignore_args = Off
+zend.exception_ignore_args = On

開発用では引数を出力するようになっているが、本播用では出力しない設定になっている

zend.exception_ignore_args
https://www.php.net/manual/ja/ini.core.php#ini.zend.exception-ignore-args

zend.exception_string_param_max_len

文字列化されたスタックトレースの引数の最大文字列長を 0 から 1000000 までの範囲で値を設定できる。

  • zend.exception_ignore_args が有効になっている場合、ここは無視される。
  • 本番環境ではこれを 0 に設定してスタックトレースでの機密情報の出力を減らすことが推奨されている。
  • デフォルト:15
  • 開発用:15
  • 本番用:0
-zend.exception_string_param_max_len = 15
+zend.exception_string_param_max_len = 0

開発用では最大文字列長が 15 文字になっていて、本番用では 0 になっている。
(本番用は zend.exception_ignore_args = On なのでそもそも使われない)

ちなみにこれは PHP 8.0 で新たに追加されたディレクティブです。(RFC

error_reporting

エラー出力レベルを設定できる。

-error_reporting = E_ALL
+error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

開発用では全てのエラーと警告を出力するようにしているが、本番用では E_DEPRECATED と E_STRICT 以外のエラーや警告が出力されるように設定されている。

エラー出力レベルについて以下を参照ください
error_reporting - PHP エラー出力レベルについて

error_reporting
https://www.php.net/manual/ja/errorfunc.configuration.php#ini.error-reporting

display_errors

PHP がエラーや通知、警告を表示するかどうかを設定する。

  • エラー表示は開発時には役に立つが、本番環境では機密情報が漏れるかもしれないので非表示にする事が推奨されている。
  • 本番環境では、エラーは STDOUT に送信するのではなく、ログに記録することが推奨されている。
  • デフォルト:On
  • 開発用:On
  • 本番用:Off
-display_errors = On
+display_errors = Off

開発用ではエラーを表示するが、本番用では表示しない設定になっている。

display_errors
https://www.php.net/manual/ja/errorfunc.configuration.php#ini.display-errors

display_startup_errors

PHPの起動シーケンス中に発生するエラーの表示は display_errors とは別に処理されるため、こちらで表示有無を設定する。

  • 構成の詳細が漏洩しないように本番環境ではオフにする事が推奨されている。
  • デフォルト:On
  • 開発用:On
  • 本番用:Off
-display_startup_errors = On
+display_startup_errors = Off

開発用ではエラーの表示が行われるのに対し、本番用では表示されない設定になっている。

display_startup_errors
https://www.php.net/manual/ja/errorfunc.configuration.php#ini.display-startup-errors

mysqlnd.collect_memory_statistics

mysqlnd によるメモリ使用統計の収集を行うかの設定。(MySQLのチューニングやモニタリングに使える)

-mysqlnd.collect_memory_statistics = On
+mysqlnd.collect_memory_statistics = Off

開発用では有効になっているのに対し、本番用では無効になっている。

mysqlnd.collect_memory_statistics
https://www.php.net/manual/ja/mysqlnd.config.php#ini.mysqlnd.collect-memory-statistics

zend.assertions

PHP が実行コードを生成する際にアサーションを含めるかの設定

設定値
  • -1:含めない
  • 0:含めるが実行時はアサーションをスキップする
  • 1:含める
  • 負の値から、または負の値への変更は、php.iniでのみ可能。
  • zend.assertions = 1 にした場合、実行時のアサーションのオン・オフの切り替えは assert.active で行える。
  • デフォルト値:1
  • 開発用:1
  • 本番用:-1
-zend.assertions = 1
+zend.assertions = -1

開発用はアサーションを含めるのに対して、本番用では含めない設定になっている。

zend.assertions
https://www.php.net/manual/ja/ini.core.php#ini.zend.assertions

assert.active
https://www.php.net/manual/ja/info.configuration.php#ini.assert.active

opcache.huge_code_pages

PHPコードを Huge Page にコピーするかどうかの設定。

  • Huge Page は Linux の機能で、メモリページングの際のチャンクサイズを増やしてパフォーマンスを向上させる機能。
  • Linux では PHP 7.0.0 以降、FreeBSD では PHP 7.4.0 以降が必要。
-;opcache.huge_code_pages=0
+;opcache.huge_code_pages=1

開発用では無効になっていて、本番用では有効になっている。

しかしどちらの環境でもコメントアウトされているので、opcache を有効化してここをチューニングする場合はコメントアウトを外してあげる必要がある。

opcache.huge_code_pages
https://www.php.net/manual/ja/opcache.configuration.php#ini.opcache.huge_code_pages

まとめ

開発時にはデバッグがしやすいように、そして本番では不要な情報の露出や無駄なリソースの消費がないように、それぞれの ini ファイルで設定されていましたね。

あなたが作っているサービスの本番環境の php.ini は、本当に本番用を元に作成されていますか?

見直してみても良いかもしれません。

ちなみに、php.ini を php.ini-development もしくは php.ini-production のどちらかから作成した場合は About this file セクションを見ると以下のように表記されているので、それをみればどちらから生成したのかがわかると思います。

php.ini
# php.ini-development から作成
; This is the php.ini-development INI file.

# php.ini-production から作成
; This is the php.ini-production INI file.