PHP: Hypertext Preprocessor (original) (raw)
コア php.ini ディレクティブに関する説明
このリストには、PHPを設定する際に使用可能なコア php.ini ディレクティブが 含まれています。拡張モジュールにより処理されるディレクティブは、それぞれの 拡張モジュールのドキュメントページにリストと詳細が記述されています。 例えば、セッション用ディレクティブに関する情報は、セッションのページにあります。
注意:
これらのデフォルト値は、php.ini が読み込まれなかったときに使われるものです。 運用時と開発時では php.ini の値が変わることもあるでしょう。
言語オプション
言語およびその他の設定オプション
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
short_open_tag | "1" | INI_PERDIR | |
precision | "14" | INI_ALL | |
serialize_precision | "-1" | INI_ALL | PHP 7.1.0 より前は、デフォルト値は 17 でした。 |
disable_functions | "" | INI_SYSTEM のみ | |
disable_classes | "" | php.ini のみ | |
exit_on_timeout | "" | INI_ALL | |
expose_php | "1" | php.ini のみ | |
hard_timeout | "2" | INI_SYSTEM | PHP 7.1.0 以降で利用可能。 |
zend.exception_ignore_args | "0" | INI_ALL | PHP 7.4.0 以降で利用可能。 |
zend.multibyte | "0" | INI_ALL | |
zend.script_encoding | NULL | INI_ALL | |
zend.detect-unicode | NULL | INI_ALL | |
zend.signal_check | "0" | INI_SYSTEM | |
zend.assertions | "1" | INI_ALL (制限あり) | |
zend.exception_string_param_max_len | "15" | INI_ALL | PHP 8.0.0 以降で利用可能。 |
以下に設定ディレクティブに関する 簡単な説明を示します。
short_open_tag
bool
PHP タグの短縮型 (<? ?>
) を使用 可能にするかどうかを設定します。PHPをXMLと組み合わせて用いる 場合は、**<?xml ?>
をファイル中で用 いるためにこのオプションをオフにする必要があります。オンにし た場合にPHPでXMLを出力するには、例えば、次のようにします。<?php echo '<?xml version="1.0"?>'; ?>
** これをオフにした場合、長い方の形式のタグ (<?php ?>
)を使用する必要があります。
注意:
これは、**
<?=
** 記法に影響を与えません。常に有効となります。
precision
int
浮動小数点数に関して表示される最大桁数を指定します。-1
は、数値を丸める際に拡張アルゴリズムを用いることを意味します。
serialize_precision
int
浮動小数点数をシリアライズするときに格納する桁数を指定します。-1
は、数値を丸める際に拡張アルゴリズムを用いることを意味します。
expose_php
bool
PHP がサーバーにインストールされていることを全世界に晒し、PHP のバージョンも HTTP ヘッダに含めます (X-Powered-By: PHP/5.3.7 など)。
disable_functions
string
このディレクティブを使うと、特定の関数を無効にすることができます。 関数名の一覧をカンマ区切りで指定します。 PHP 8.0.0 以降では、関数を無効にすると定義を削除しますが、 ユーザーランドで再定義できます。 PHP 8.0.0 より前のバージョンでは、 関数を無効にすると、その関数は呼び出せませんでした。 このディレクティブを使って無効にできるのは、内部関数 だけです。ユーザー定義関数 は影響を受けません。 このディレクティブは php.ini で設定しなければなりません。httpd.conf では設定できません。
disable_classes
string
このディレクティブを使うと、特定のクラスを無効にすることができます。 クラス名の一覧をカンマ区切りで指定します。 クラスを無効にすると、クラスのインスタンス化ができなくなります。
このディレクティブを使って無効にできるのは、内部クラスのみです。 ユーザーが定義したクラスは影響を受けません。
このディレクティブは php.ini で設定しなければなりません。httpd.conf では設定できません。
zend.assertions
int
1
にすると、アサーションのコードを生成して実行します (開発モード)。0
にすると、アサーションのコードは生成しますが実行時にはスキップします (実行しません)。-1
にすると、アサーションのコードを生成せず、アサーションのコストがゼロになります (実運用モード)。
注意:
実運用モードで開始したプロセスでは、zend.assertions を実行時に変更することはできません。アサーションのコードが生成されていないからです。
開発モードで開始したプロセスでは、zend.assertions を実行時に
-1
に変更することはできません。
zend.exception_string_param_max_len
int
文字列化されたスタックトレース中の、関数の引数の長さの最大値。"0"
と "1000000"
の間でなければいけません。
hard_timeout
int
max_execution_time で設定されたタイムアウトに達すると、 PHPランタイムはリソースをgracefulに開放します。 リソースを開放する処理が何らかの原因で止まってしまった場合、 hard_timeout のカウントがここで設定した秒数行われます。 hard_timeout のタイムアウトに達すると、 PHP はgracefulにリソースを開放せずに終了します。 この値を 0 に設定すると、この機能は無効になります。
PHP が hard timeout で停止すると、 以下のようなメッセージが残るでしょう。
Fatal error: Maximum execution time of 30+2 seconds exceeded (terminated) in Unknown on line 0
zend.exception_ignore_args
bool
例外経由で生成されたスタックトレースから、引数を除外します。
zend.multibyte
bool
マルチバイトエンコーディングで書かれたソースファイルをパースできるようにします。 zend.multibyte を有効にしないと、マルチバイト文字データの中に特殊文字を含むエンコーディング (SJIS や BIG5 など) を使えません。 ISO-8859-1 互換のエンコーディングである UTF-8 や EUC などを使う場合は、このオプションは不要です。
zend.multibyte を有効にしたい場合は、mbstring 拡張モジュールを有効にしなければいけません。
zend.script_encoding
string
この値を使うのは、declare(encoding=...) ディレクティブがスクリプトの先頭に存在しない場合です。 ISO-8859-1 非互換のエンコーディングを使う場合は、 zend.multibyte と zend.script_encoding を両方とも指定する必要があります。
リテラル文字列は、zend.script_encoding から mbstring.internal_encoding に変換されます。mb_convert_encoding() が呼ばれたときと同じです。
zend.detect_unicode
bool
BOM (Byte Order Mark) を調べ、 ファイルが有効なマルチバイト文字を含むかどうかを確認します。 この検出は、__halt_compiler() の処理より前に行われます。 Zend Multibyte モードでのみ利用可能です。
zend.signal_check
bool
置き換えられたシグナルハンドラを、シャットダウン時にチェックします。
exit_on_timeout
bool
これは Apache1 の mod_php だけで使える項目で、PHP の実行タイムアウトが発生したときに Apache の子プロセスを強制終了させます。このタイムアウトがおこると Apache1 の内部で longjmp() がコールされ、その結果としていくつかの拡張モジュールが一貫性を欠く状態になってしまいます。 プロセスを強制終了させることで、未処理のロックやメモリの後始末も行います。
リソース制限
リソース制限
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
memory_limit | "128M" | INI_ALL |
以下に設定ディレクティブに関する 簡単な説明を示します。
memory_limit
int
スクリプトが確保できる最大メモリをバイト数で指定します。この命令は、 正しく書かれていないスクリプトがサーバーのメモリを食いつぶすことを防止するのに役立ちます。 もし、使用可能メモリに制限を設けたくない場合は、 ここに -1
を指定してください。
intを使用する際、 その値はバイト単位で測られます。この FAQ に記載された 短縮表記を使用することも可能です。
max_execution_time も参照ください。
パフォーマンスチューニング
パフォーマンスチューニング
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
realpath_cache_size | "4M" | INI_SYSTEM | PHP 7.0.16 および 7.1.2 より前のバージョンでは、 デフォルト値は "16K" でした。 |
realpath_cache_ttl | "120" | INI_SYSTEM |
注意:
open_basedir を使用すると、 realpath キャッシュが disable にされます。
以下に設定ディレクティブに関する 簡単な説明を示します。
realpath_cache_size
int
PHP が使用する realpath キャッシュの大きさを設定します。 PHP で大量にファイルをオープンする際に、 この値を大きくすることによってファイル操作のパフォーマンスを 向上させます。
このサイズが表すのは、格納するパス文字列の総バイト数と、 キャッシュエントリに関連づけるデータのサイズを足したものです。 つまり、長いパスをキャッシュに格納するには、キャッシュのサイズを大きくしなければいけません。 この値を使って、最大何件のパスをキャッシュするのかを制御することはできません。
キャッシュエントリのデータに必要なサイズは、システムによって変わります。
realpath_cache_ttl
int
与えられたファイルやディレクトリについての realpath 情報キャッシュの有効期限を (秒単位で) 設定します。 ファイルを変更することがほとんどない場合は、 この値を大きくすることを検討してください。
パスおよびディレクトリ
パスおよびディレクトリ設定オプション
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
include_path | ".;/path/to/php/pear" | INI_ALL | |
open_basedir | NULL | INI_ALL | |
doc_root | NULL | INI_SYSTEM | |
user_dir | NULL | INI_SYSTEM | |
user_ini.cache_ttl | "300" | INI_SYSTEM | |
user_ini.filename | ".user.ini" | INI_SYSTEM | |
extension_dir | "/path/to/php" | INI_SYSTEM | |
extension | NULL | php.ini のみ | |
zend_extension | NULL | php.ini のみ | |
cgi.check_shebang_line | "1" | INI_SYSTEM | |
cgi.discard_path | "0" | INI_SYSTEM | |
cgi.fix_pathinfo | "1" | INI_SYSTEM | |
cgi.force_redirect | "1" | INI_SYSTEM | |
cgi.nph | "0" | INI_SYSTEM | |
cgi.redirect_status_env | NULL | INI_SYSTEM | |
cgi.rfc2616_headers | "0" | INI_ALL | |
fastcgi.impersonate | "0" | INI_SYSTEM | |
fastcgi.logging | "1" | INI_SYSTEM |
以下に設定ディレクティブに関する 簡単な説明を示します。
include_path
string
require、include、fopen()、file()、readfile() および file_get_contents() 関数がファイルを 探すディレクトリのリストを指定します。フォーマットは、システ ムの環境変数 PATHと同じです。つまり、UNIXでは コロンで、Windowsではセミコロンで区切ったディレクトリのリスト で指定します。
PHP は、インクルードするファイルを探す際に インクルードパスの各エントリを個別に調べます。 まず最初のパスを調べ、見つからなければ次のパスを調べ、…… というように、ファイルが見つかるか**[E_WARNING](errorfunc.constants.php#constant.e-warning)
** あるいは [E_ERROR](errorfunc.constants.php#constant.e-error)
が発生するまで続けます。インクルードパスを実行時に変更したり設定したりするにはset_include_path() を使用します。
例1 Unix include_path
include_path=".:/php/includes"
例2 Windows include_path
include_path=".;c:\php\includes"
インクルードパスに .
(カレントディレクトリ) を指定すると、相対パス指定によるインクルードができるようになります。 しかし、インクルードのたびに毎回 PHP にカレントディレクトリをチェックさせるよりは、 明示的に include './file'
を指定したほうが効率的です。
注意:
ENV
変数は .ini ファイルの中でもアクセスできます。 たとえば、ホームディレクトリを参照するときに${LOGIN}
や${USER}
が使えます。環境変数はサーバー API の種類によって異なるので、この環境も異なることがあります。
例3 Unix include_path で環境変数 ${USER} を使う例
include_path = ".:${USER}/pear/php"
open_basedir
string
PHP からアクセスできるファイルを、指定したディレクトリツリーに限定します。 ファイル自身も含みます。
スクリプトからinclude や fopen() などでファイルシステムにアクセスしようとしたときに、そのファイルの場所をチェックします。 ファイルが指定したディレクトリツリーの外にある場合は、PHP はそのファイルへのアクセスを拒否します。 シンボリックリンクの解決も行うので、 シンボリックリンクでこの制限を回避することはできません。 存在しないファイルへのシンボリックリンクは解決できないので、 ファイル名を open_basedir と比較します。
open_basedir は、ファイルシステム関数以外の挙動にも影響を及ぼします。 たとえば MySQL
の設定で mysqlnd
ドライバーを使うようにしている場合に、LOAD DATA INFILE
は open_basedir の影響を受けます。 PHP の拡張モジュールの多くが、open_basedir
をこのように利用しています。
特別な値 .
は、 スクリプトの作業ディレクトリを表します。これをベースディレクトリとすることもできますが、 少し危険です。スクリプトの作業ディレクトリはchdir() で容易に変更できるからです。
httpd.conf で、(たとえばバーチャルホスト単位で)open_basedir を無効にすることができます。 その他の設定ディレクティブの場合と同様に "php_admin_value open_basedir none
" のようにします。
Windows では、ディレクトリの区切りはセミコロンとなります。 その他のシステムでは、コロンで区切ります。Apache モジュールでは、 親ディレクトリからの open_basedir パスを自動的に継承します。
open_basedir で指定する制約は、 ディレクトリ名となります。プレフィックスではありません。
デフォルトでは、すべてのファイルを開くことができます。
注意:
open_basedir の設定を実行時に厳しくすることができます。 これは、open_basedir が php.ini で
/www/
と設定されているときに、スクリプト内でini_set() を使って設定を厳しくして/www/tmp/
のようにできるということです。 複数のディレクトリを指定するときには、定数[PATH_SEPARATOR](dir.constants.php#constant.path-separator)
を使えば OS に依存しない記述ができます。
注意:
open_basedir を使用すると、realpath_cache_size は
0
に設定され、結果として realpath キャッシュは disable にされます。
警告
open_basedir
は、追加のセキュリティ機構でしかありません。 つまり、広範囲に適用できるものでは決してないため、 セキュリティを高める必要がある際にそれだけに依存してはいけません。
doc_root
string
サーバーにおけるPHPの"ルートディレクトリ"です。この値は空で無 い場合のみ使用されます。 PHPがFORCE_REDIRECTを指定してコンパイルされていない場合、 (IIS以外の)WebサーバーのもとでCGIとしてPHPを実行する際には、 doc_rootを指定するべきです。 他の方法としては、後述の cgi.force_redirect 設定の使用があります。
user_ini.cache_ttl
int
user_ini.filename
string
user_dir
string
PHPファイル用にユーザーのホームディレクトリ として使用する基本ディレクトリの名前。例えば、public_html
となります。
extension_dir
string
動的にロード可能な拡張モジュールを置くディレクトリを 指定します。 絶対パスを指定することを推奨します。enable_dl とdl() も参照ください。
extension
string
PHP の開始時に、どの動的ロード可能な拡張モジュールをロードするかを指定します。
zend_extension
string
PHP の起動時に読み込む動的読み込み可能な Zend 拡張モジュール (たとえば XDebug) の名前。
cgi.check_shebang_line
bool
CGI 版の PHP が、実行するスクリプトの先頭にある #!
から始まる行 (shebang) をチェックするかどうかを指定します。 同じスクリプトをスタンドアロンと PHP CGI 経由の両方で使用したい場合などに、 この行が必要になるでしょう。このディレクティブを on にしておくと、CGI 版の PHP はこの行の内容を読み飛ばすようになります。
cgi.discard_path
bool
これを有効にすると、PHP CGI のバイナリを web ルートのツリーの外部に配置できるようになります。 これで、.htaccess のセキュリティをくぐり抜けてアクセスされる心配がなくなります。
cgi.fix_pathinfo
bool
本来の PATH_INFO
/PATH_TRANSLATED
サポートをCGIで提供します。 PHPの以前の動作は、SCRIPT_FILENAME
にPATH_TRANSLATED
を設定するというもので、PATH_INFO
の定義を理解していませんんでした。PATH_INFO
に関する詳細については、CGIの仕様を参照ください。 このオプションを1
にすることにより、 PHP CGIはこのパスを仕様にあうように修正します。 ゼロとすると、 PHPは以前と同様に動作します。これは、デフォルトでオンになっています。PATH_TRANSLATED
ではなく、SCRIPT_FILENAME
を使用するようにスクリプト を修正する必要があります。
cgi.force_redirect
bool
cgi.force_redirect は、ほとんどのWebサーバーのもとで CGI として PHP を実行する際のセキュリティを確保するために必要です。 未定義のままの場合、PHPはデフォルトでこれを on にします。 これを off にする時は、自己責任 の下に 行なってください。
注意:
Windowsユーザー: IIS を使う場合は、このオプションは_必ず_ off にしなければなりません。 OmniHTTPD や Xitami の場合も同様です。
cgi.nph
bool
cgi.nph を有効にすると、すべてのリクエストに対して cgi がステータスコード 200 を返すように強制します。
cgi.redirect_status_env
string
cgi.force_redirect を on にし、Apache または Netscape (iPlanet) Webサーバーのもとで実行していない場合、 実行を継続して良いかどうかをPHPが判断するために 環境変数の名前を設定する必要があるかもしれません。
注意:
この変数を設定することにより、セキュリティ上の問題を発生する 場合があります。行うことのリスクをまず把握してください。
PHP に、HTTP レスポンスを返す際に、どの形式のヘッダーを使うか 指示します。0 にセットした場合は、Apache やその他の web サーバーで サポートされている » RFC 3875 Status: ヘッダーを送信します。このオプションの値を 1 にセットした場合は、PHP は » RFC 2616 の仕様に適合した形式のヘッダーを送信します。
このオプションを有効にして、かつ PHP を CGI 環境 (PHP-FPM など) で動かしている場合は、 標準の RFC 2616 形式の HTTP ステータスレスポンスヘッダーを使ってはいけません。そのかわりに RFC 3875 形式にする必要があります。つまり、 header("HTTP/1.0 404 Not found"); ではなく header("Status: 404 Not Found"); にしなければいけないということです。
よくわからないときは、この値は 0 のままにしておきましょう。
fastcgi.impersonate
string
IIS (または WINNT ベースの OS) のもとでの FastCGI は、 クライアントをコールする際にセキュリティトークンを 匿名化する機能をサポートしています。 これにより、IIS がリクエストを処理するセキュリティコンテキストを 定義できるようになります。Apacheのもとで実行される mod_fastcgi は現在 (2002/03/17) この機能をサポートしていません。 IIS のもとで実行するには、1 に設定してください。 デフォルトは 0 です。
fastcgi.logging
bool
FastCGI 使用中の SAPI ロギングを有効にします。 デフォルトはロギングが有効となっています。
SQL全般
SQL全般の設定オプション
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
sql.safe_mode | "0" | INI_SYSTEM | PHP 7.2.0 以降は削除されています。 |
以下に設定ディレクティブに関する 簡単な説明を示します。
sql.safe_mode
bool
オンにすると、デフォルト値が指定されているデータベース接続関数は、 引数で指定された値よりもデフォルト値を優先して使用します。 デフォルト値の詳細については、関連するデータベースのドキュメントを参照ください。
警告
この機能は PHP 7.2.0 で 削除 されました。
Windows のみ
Windows 特有の設定オプション
名前 | デフォルト | 変更可能 | 変更履歴 |
---|---|---|---|
windows.show_crt_warning | "0" | INI_ALL |
以下に設定ディレクティブに関する 簡単な説明を示します。
windows.show_crt_warning
bool
このディレクティブを有効にすると、Windows CRT の警告を表示します。
Improve This Page
3 years ago
`Be careful while using auto_prepend_file.
When the custom exception handler, set by set_exception_handler(), handles an uncaught exception, it interrupts the execution of every script.
If the script with the unhandled exception has been automatically prepended or included by an automatically prepended script, however, the main script will continue running anyway.
This could cause several issues: when we think that throwing an exception would automatically interrupt the current application, a whole chunk of code is going to run anyway.
`
diamondeagle at webmail dot co dot za ¶
5 years ago
`Note regarding the upload_tmp_dir setting and UNC Paths:
When using PHP on Windows OS and IIS FastCGI, if you need to use a UNC path to a folder on a network drive for the upload_tmp_dir setting then you must use three \ characters at the front of the UNC path.
Windows and PHP use the first slash as an escape character, so if you only use two slashes then it passes a UNC path with just one backslash. That is not valid for UNC paths and you many experience problems when uploading files, such as errors saying that "PHP is missing a temporary folder".
Correct:
upload_tmp_dir = "\\path\to\your\folder"
Incorrect:
upload_tmp_dir = "\path\to\your\folder"
`
fernandobasso dot br at gmail dot com ¶
8 years ago
`` This might help in case someone happens to maintain old applications with a charset other than utf-8.
According to the docs, you can override the default charset if you use header()
.
Suppose php.ini sets the default_charset to "UTF-8", but you need a legacy charset, like ISO-8859-1.
Still,
would not override the charset, just add it as well and the result
was a response header like (note the two charsets):
Content-Type:"text/html; Charset=ISO-8859-1;charset=UTF-8"
I found it strange the default one as charset
with a lowercase c
as opposed to my custom charset with an uppercase C
.
What solved was to override the charset using all lowercase letters
as well for the word “charset”:
Then, the double charset from the response headers disappeared, and only the single, custom charset remained.
``
5 months ago
`you get a misleading error if a directory doesn't exist or the user lacks permission to access it.
open_basedir restriction in effect. File(/tmp/php_session) is not within the allowed path(s): /tmp/php_session
`
18 years ago
`"If the size of post data is greater than post_max_size..."
It seems that a more elegant way is comparison between post_max_size and $_SERVER['CONTENT_LENGTH']. Please note that the latter includes not only size of uploaded file plus post data but also multipart sequences. Leo
`
andre dot wetter at myelco dot ch ¶
3 years ago
`If you use Microsoft IIS Windows and want to use open_basedir restrictions with multiple dirs you have to set them into single quotes in the main config xml file of IIS (C:\Windows\System32\inetsrv\config\applicationHost.config). Works fine in IIS 10.
Multiple files with single quotes and ; for windows:
"C:\php\php-cgi.exe|-d open_basedir='C:\Windows\Temp;D:\mywebsite1'"
Only one dir works fine without single quotes:
"C:\php\php-cgi.exe|-d open_basedir=D:\mywebsite1"
In my main config xml file of IIS there are 2 nodes to set per website and the definitions have to be equal:
configuration\Location\system.webServer\handlers\add
configuration\system.webServer\fastCgi
`
4 years ago
I had a problem with 'open_basedir =' string in php.ini. This string was writtren in VirtualHost Directory directive of Apache2 and successfully rewrote the same php.ini setting! It happened with VestaCP, but I think, it's a common way. Goog luck!
8 years ago
`It appears that if you use both the 'include_path' directives and 'open_basedir', that file searches will hit the include path first, before local files. But if 'open_basedir' is not in use, then local files are found first. For example, suppose you have code in '/var/www/myfile.php' which does:
Further, assume that there is a local file '/var/www/config.php', and there is also a file '/var/local/php/config.php'.
Next, if your php.ini has:
include_path = /var/local/php/
Normally, this would look for '/var/www/config.php' first, and if not found, then it would try '/var/local/php/config.php'.
But if you also have this in php.ini:
open_basedir = /var/www/:/var/local/php/
Then the require would reverse the order of the search, and load '/var/local/php/config.php', even when the local 'config.php' file exists.
Furthermore, if include_path contains directories not in open_basedir, you can end up with a fatal error. For example, change the directive to:
open_basedir = /var/www/:/var/local/includes/php/
Now the require will first find '/var/local/php/config.php' from the include_path, try to include it, but be unable to because of the open_basedir restrictions.
`