PHP

php.iniのディレクティブ(設定項目)をまとめてみた【徹底調査】

php.iniのディレクティブ(設定項目)をまとめてみた【徹底調査】

この記事は作成途中です。

初めてphp.iniの設定をしようと思ったとき、私はこう思いました。

設定項目多いし、何が何やら分からない。。

 

ただでさえ設定項目が多い上に、一つ一つの項目の意味も分からなかったので完全にお手上げ状態だったのです。

 

そこで今回は、自分の勉強も兼ねて主要なphp.iniの設定項目について調べてまとめました。

少しでもこれからphp.iniの設定をしようとしている方の参考になれば幸いです。

 

php.iniのディレクティブ(設定項目)をまとめてみた【徹底調査】

Docker等でPHPが動作する環境を立ち上げると、デフォルトでphp.ini-productionとphp.ini-developmentが存在することが確認できます。

これは、その名の通り、開発環境でオススメのphp.iniの設定と本番環境でオススメのphp.iniの設定です。

 

今回は、これらのファイルの中身について、設定項目の意味を調べました。

 

php.iniの設定項目

php.iniの中には非常に多くの記述があります。しかし、そのほとんどはコメントです。

そのため今回は、コメントは全て削除した状態で掲載します。

また、php.ini-developmentとphp.ini-productionは、設定項目の値が違うだけで、設定項目自体はほとんど同じなので、今回はphp.ini-developmentを題材に解説していきます。(production独自のディレクティブについては後ほど解説します)

 

それでは、上記の設定について、一つ一つ解説していきます。

 

engine

 

engine = On

PHP実行時の動作を規定するディレクティブの一つで、Apacheモジュール版のPHPでのみ使用することができます。

名前の通り、PHP(engine)の有効・無効を指定することができます。

つまり、Onにしておくと、PHPのコードを解釈(パース)して適切に動作させることができるけど、OffにしておくとPHPのコードが単なる文字の羅列として表示されるということです。

この設定は、.htaccess等で上書きすることも可能なので、php.iniでは基本的にOnにしておくと良いでしょう。

参考:実行時設定:engine

 

short_open_tag

 

short_open_tag = Off

 

PHPタグ(<?php ?>)の短縮型 (<? ?>) を使用可能にするかどうかを設定することができます。Onにすると、短縮形を使用することができます。

Onにしておいてもいいですが、xmlを使用する場合は、以下のようなコードを書いたときにPHPのコードとして解釈してしまうため注意しましょう。

<?xml version="1.0" encoding="Shift_JIS"?>

 

基本的には、Offにしておいて毎回ちゃんと<?php ?>を書くのが良いと思います。

参考:short_open_tag

 

precision

 

precision = 14

 

浮動小数点数に関して表示される最大桁数を指定することができます。

例えば、precision = 1とすると、var_dumpで2/3を出力したとき、0.7が出力されます。

一方、precision = 14とすると、var_dumpで2/3を出力すると0.66666666666667が出力されます。

 

output_buffering

 

output_buffering = 4096

 

output_buffering(出力バッファリング)とは、PHP がクライアントにデータを送信する前に内部的に保持しておくべき出力データ (HeaderやCookieを除く) の量を制御するためのディレクティブです。

このディレクティブをOnを指定することで、全てのファイルに関して出力バッファリングを有効にすることができます。また、特定の大きさにバッファの大きさを制限したい場合は、Onの代わりにバイト数を直接指定することもできます。

アプリケーションの出力がこの設定値を超えている場合、PHPは指定したサイズのデータを大まかにまとめて送信します。

 

パフォーマンスの観点で言うと、本番環境(production)ではoutput_buffering = 4096を指定するのが良いようです。

 

zlib.output_compression

zlib.output_compression = Off

 

透過的なページ圧縮を行うかどうかを指定します。

Onを指定した場合、ブラウザが”Accept-Encoding: gzip”または”deflate”ヘッダを送信する際に、ページが圧縮されます。

ブラウザのテキストデータを圧縮してトラフィックを削減する効果があるようです。

 

参考:zlib.output_compression

 

implicit_flush

 

implicit_flush = Off

 

Onにすることで、PHPが各出力ブロックの後で自動的に出力レイヤをフラッシュするよう 指定できます。

これは、printあるいはecho、HTMLブロックの後でflush() 関数をコールする場合と同じ動作を実現します。

Onにすると、パフォーマンスに深刻な影響を与えるので、一般的にはデバッグ目的でのみ使用することが推奨されているらしいです。

そのため、基本的にはdevelopmentでもproductionでもOffを指定しておくと良いでしょう。

参考:implicit_flush

 

unserialize_callback_func

 

unserialize_callback_func =

 

unserialize()が未定義のクラスを使おうとしたときに、ここで指定したコールバックが呼ばれます。

ここで指定したコールバック関数が定義されていない場合や、そのコールバック関数が未定義のクラスの定義に失敗したときに警告が発生します。

 

デフォルトでは空になっているので、必要なときには、独自のコールバックを指定するようにしましょう。

参考:unserialize_callback_func

 

serialize_precision

serialize_precision = -1

 

浮動小数点数をシリアライズ(serialize)するときに格納可能な桁数を指定することができます。

シリアライズとは、配列やオブジェクトなどをそのまま配列・オブジェクトとして保存したい場合に使う手法のことです。

PHPの場合、データベースにデータ(オブジェクトや配列)を登録する前にserialize関数を使ってデータをserializeし、データベースから取り出した際にそのデータをunserialize関数でデシリアライズすることで、そのままのデータ形式(オブジェクトや配列)でデータを扱うことができます。

そして、serialize_precisionでは、シリアライズ(serialize)するときに格納することができる浮動小数点数の桁数を指定することができます。

 

例えば、serialize_precision=2を指定した場合は、以下のように浮動小数点数の2桁分だけが保存されます。

そして、serialize_precision=12を指定した場合は、以下のように浮動小数点数の12桁分が保存されます。

また、-1は、数値を丸める際に拡張アルゴリズムを用いることを意味します。

要は、自動的に良い感じに数字を整えてくれるということです。

こんな感じ。

 

特にこだわりがない場合は-1を指定しておくので良いと思います。

 

disable_functions

disable_functions =

 

特定の関数を無効にすることができるディレクティブです。

カンマ(,)区切りで任意の関数を指定できます。

 

ただし、指定できるのは、PHPの内部(ビルトイン)関数だけです。

独自に定義したメソッドを指定することはできないので、その点は注意しましょう。

参考:disable_functions

 

disable_classes

disable_classes =

 

特定のクラスを無効にするためのディレクティブです。
ここにハイフン(,)区切りでクラス名を指定することで、それらのクラスを無効にすることができます。

zend.enable_gc

zend.enable_gc = On

 

循環参照コレクタを有効(On)あるいは無効(Off)にするディレクティブです。

循環参照コレクタとは、PHPのGC(ガベージコレクション)の仕組みの一つです。

PHPには元々参照カウントに基づいたGCしかなかったのですが、PHP5.3から、循環参照に対応したGCが導入されました。

このディレクティブでは、そのGCの機構を有効(無効)にすることができます。

 

zend.exception_ignore_args

zend.exception_ignore_args = Off

 

PHP7.4から新たに導入されたディテクティブです。

例外のために生成されたスタックトレース(エラー発生までの処理の呼び出し履歴)に引数を含めるかどうかを指定することができます。

 

説明を読む限り、開発段階ではOffにしておいて問題ないみたいです。

しかし、本番環境でこの設定をOffにしていると、機密情報が出力される可能性があるため、本番にデプロイするiniファイルではこのディレクティブにはOnを設定しておきましょう。

参考:zend.exception_ignore_args

 

zend.exception_string_param_max_len

zend.exception_string_param_max_len = 15

 

PHP8から追加されたディレクティブです。

例外発生時に出力される文字列化されたスタックトレースの引数の最大文字列長を0から1000000の間の値に設定することができます。

 

開発時はデフォルトの15で大丈夫ですが、本番環境では情報を秘匿する必要があるため、0を設定しておきましょう。

 

参考:zend.exception_string_param_max_len

 

expose_php

expose_php = On

 

このディレクティブでは、PHPがサーバにインストールされている事実を公開するかどうかを指定することができます。

Onにしておくと、Webサーバのヘッダに署名を追加する等の変化が加えられます。

 

Onにしておいてもセキュリティ上の問題は無さそうなので、開発の方針に合わせてOnかOffのどちらかを設定しておくようにしましょう。

 

参考:expose_php

 

max_execution_time

max_execution_time = 30

 

このディレクティブでは、PHPスクリプトの最大実行時間を指定することができます。

ここで設定した時間を超過した場合は、自動的に処理が中断されます。

 

ここに適切な値を指定しておくことで、例えば無限ループのような処理が発生したときに、サーバーの負荷が上がるのを防ぐことができます。

 

デフォルトは30秒ですが、個人やチームの方針に合わせて適切な値を設定しましょう。

 

max_input_time

max_input_time = 60

 

このディレクティブでは、各スクリプトがリクエストデータを解析するのに費やす最大時間を秒単位で設定することができます。

要は、サーバー側でPHPが起動してからスクリプトの実行を開始するまでの最大時間です。

 

デフォルトの値は-1 (Unlimited)ですが、無駄に処理時間が長いスクリプトを排除するために、本番環境ではこのディレクティブに時間の設定を加えておきましょう。

 

参考:max_input_time

 

memory_limit

memory_limit = 128M

 

このディレクティブでは、スクリプトが確保できる最大メモリをバイト数で指定することができます。

要は、PHPのスクリプトが使うメモリ数に上限を設定することができるということです。

 

このディレクティブに適切な値を設定することで、不適切なコードがメモリを無駄に消費するのを防ぐことができます。

例えば、memory_limit = 1にしてphpunitのテストを回してみると、以下のようにエラーが表示されます。

memory_limit

 

記法としては、基本的にはバイト数を直接指定しますが、短縮形で記述することも可能です。

また、メモリ数に制限を持たせたくない場合は、memory_limit = -1を指定することでメモリを無制限にすることも可能です。

参考:memory_limit

 

error_reporting

error_reporting = E_ALL

 

このディレクティブでは、エラーの出力レベル(どのエラー、警告、通知に対してアクションを取らせたいか)を設定できます。

 

設定できるエラーの定数についてはこちらを参考にして下さい。

 

デフォルトでは、E_NOTICEとE_STRICTに関連するものを除いたすべてのエラー、通知、警告に対して処理を行うように設定されています。

 

開発環境ではE_ALL、本番環境ではE_ALL & ~E_DEPRECATED & ~E_STRICTが推奨の設定値です。

参考:error_reporting

 

display_errors

display_errors = On

 

このディレクティブは、PHPがエラーや通知、警告をHTML出力の一部として画面に出力するかどうかを制御します。

 

開発環境ではデバッグのためにOnにしておいて大丈夫です。

 

しかし、本番環境では必ずOffを設定するようにしましょう。(デフォルトがOnなので必ず設定が必要)

なぜなら、データベースのユーザ名やパスワードなどの機密情報が表示されてしまう可能性があるからです。

 

本番環境では、発生したエラーをstdoutに送るのではなく、ログに出力して記録すると良いでしょう。

 

参考:display_errors

 

display_startup_errors

display_startup_errors = On

 

このディレクティブでは、PHPの起動シーケンス中に発生するエラーを表示するか否かを設定します。

 

一つ前に紹介したdisplay_errorsはPHPのスクリプト中で発生するエラーですが、display_startup_errorsはスクリプトの前段階のエラーです。

 

開発環境ではOnにしておいても問題はないですが、本番環境では、秘匿情報が漏れるのを防ぐために必ずOffを設定するようにしましょう。

 

参考:display_startup_errors

 

log_errors

log_errors = On

 

エラーメッセージを、サーバーのエラーログまたはerror_logに記録するかどうかを指定するディレクティブです。

 

開発環境はもちろんのこと、本番環境でもOnにしておいて大丈夫です。

ただし、機密情報が外部に漏洩するのを防ぐため、本番環境ではエラー「表示」を行う代わりに、エラーをログ等に「記録」するようにしましょう。

 

参考:log_errors

 

log_errors_max_len

log_errors_max_len = 1024

 

このディレクティブでは、log_errorsの最大長をバイト単位で設定することができます。

要は、エラーを表示する際の最大文字長を指定できます。

 

デフォルトの数は1024で、0を指定すると最大長の制限は無くなります。

 

参考:log_errors_max_len

 

ignore_repeated_errors

ignore_repeated_errors = Off

 

このディレクティブでは、繰り返されるメッセージをログに記録するか否かを指定します。

Onにすると、繰り返しのメッセージが無視されます。

 

開発環境でも本番環境でも、基本的にはOff(繰り返しのメッセージも記録する)が推奨です。

参考:ignore_repeated_errors

 

ignore_repeated_source = Off

ignore_repeated_source = Off

 

このディレクティブでは、繰り返しのメッセージを無視する場合に、メッセージのソースを考慮するか否かを指定できます。

この設定をOnにしていると、異なるファイルまたはソース行からであっても、同じエラーメッセージの場合は記録されなくなります。

 

参考:ignore_repeated_source

 

report_memleaks

report_memleaks = On

 

このディレクティブでは、メモリリーク(メモリの解放忘れでメモリの使える容量が減っていく現象)をstdoutやログに表示するかしないかを指定できます。

 

Onの場合は表示されて、Offの場合は表示されません。

 

また、このパラメータが使えるのはデバッグビルドだけであり、かつerror_reportingで E_WARNINGを有効にしている場合のみです。

参考:report_memleaks

 

variables_order

variables_order = "GPCS"

 

このディレクティブでは、PHPの起動時にどのスーパーグローバル配列を登録するかを指定します。

 

G,P,C,E,S は、それぞれのスーパーグローバルの略語で、GET、POST、COOKIE、ENV、SERVERです。

 

例えば、variables_orderを”SP”にすると、PHPは$_SERVERおよび$_POSTは作成しますが、$_ENV、$_GET、$_COOKIEは作成しません。

また、””に設定すると何も設定されなくなります。

 

開発環境、本番環境共にEは非推奨ですが、これはパフォーマンスへの影響があるからみたいです。

参考:php.ini-recommendedで、variables_orderがGPCSである理由と、PHP5のauto_globals_jit

参考:variables_order

 

request_order

request_order = "GP"

 

このディレクティブでは、どのスーパーグローバルデータ (G,P,C) をスーパーグローバル配列$_REQUEST($_GET、$_POSTそして$_COOKIEの内容をまとめた連想配列)に登録するかを指定します。

また、登録する順番も同時に指定します。登録は左から右の順に行い、後から登録した値が古い値を上書きする形式です。

 

このディレクティブが設定されていない場合は、variables_orderの設定が反映されます。

 

オススメの設定は開発環境、本番環境共にrequest_order = “GP”です。

セキュリティのため、CookieのCは含まれていません。

 

参考:request_order

 

register_argc_argv

register_argc_argv = Off

 

 

php.ini-productionのディレクティブまとめ【devにないやつ】

 

 

php.iniのテンプレ

php.ini-development

 

php.ini-production

 

おわりに

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA