php.ini徹底分析-2

  • 投稿者:
  • 投稿カテゴリー:PHP

php -v
PHP 5.4.4-14+deb7u5 (cli) (built: Oct 3 2013 09:24:58)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
以降PHP5.4.4環境で実施
★マークは今のところよくわからないので、そのうち対応

[PHP]セクションについて

engine = On

PHP によるパースのオン/オフを切り替え。Apacheモジュール版のPHPでのみ有効
Offとすると、パースされないためソースが表示される
2013-10-29_232422

short_open_tag = On

PHP タグの短縮型 (<? ?>) を使用 可能にするかどうかを設定
Offとしてタグの短縮型を利用すると、画面がホワイトアウトする。ログへの出力はなかった

asp_tags = Off

ASP 形式のタグ <% %> を通常のタグ に加えて使用可能にする

precision = 14

浮動小数点数に関して表示される最大桁数を指定する

<?php
 var_dump(2/3);
?>

precision=1とした場合、float(0.7)
precision=12とした場合、float(0.666666666667)

output_buffering = 4096

ディレクティブを ‘On’ と設定すると全てのファイルに関して出力バッファリングを有効にする
ただしheadersとcookieは含まれない
PHPでは内部に一旦ためてから、クライアントへ返答する
アプリケーション出力がバッファを超えていれば、分割して送信される
そのため、バッファを越えないような設定がパフォーマンスをあげる(のか?)
本来は HTML 出力する前に setcookie()する必要があるが、HTMLを出力しきった後のsetcookieしてもエラーとならないのは、このバッファのおかげだったりする
★todo

zlib.output_compression = Off

透過的なページ圧縮を行うかどうか
“On” に設定された場合、 ブラウザが “Accept-Encoding: gzip” または “deflate” ヘッダを送信する場合に、ページは圧縮される
“Content-Encoding: gzip” (および “deflate”) と “Vary: Accept-Encoding” ヘッダが出力に追加される

★todo mod_deflateとどっちが効果があるのか?

implicit_flush = Off

デフォルトは FALSE を TRUE に変更すると、PHP が各出力ブロックの後で自動的に出力レイヤをフラッシュする
著しい性能低下が生じるため、通常はデバッグ目的のみにするのがよい
PHP スクリプト側で長時間の処理を行う場合、定期的にサーバ側からデータを送ることで、ブラウザからの接続の切断を防ぐことができるらしい

★todo よくわからん
http://q.hatena.ne.jp/1295482319

unserialize_callback_func =

unserialize() が未定義のクラスを使おうとしたときに、ここで指定したコールバックをコールする
ユーザーからの入力をそのまま unserialize() に渡した場合、アンシリアライズの時には、オブジェクトのインスタンス生成やオートローィングなどで コードが実行されることがあり、悪用できるため

★todo http://php.plus-server.net/function.unserialize.html

serialize_precision = 17

浮動小数点数をシリアライズするときに格納する桁数を指定する

<?php
$data=array
(
'key1' => 1.444,
'key2' => 'value2',
);
var_dump($data);

$serial=serialize($data);
var_dump($serial);

$serial=unserialize($serial);
var_dump($serial);

?>

serialize_precision=2としたとき、以下が実行結果
array(2) {
[“key1”]=>
float(1.444)
[“key2”]=>
string(6) “value2”
}
string(47) “a:2:{s:4:”key1″;d:1.4;s:4:”key2″;s:6:”value2″;}”
array(2) {
[“key1”]=>
float(1.4)
[“key2”]=>
string(6) “value2”
}

参考:http://tech.akat.info/?p=70

disable_functions =
pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,

スクリプト内で使用を禁止する関数の設定
プロセスに対して、 指定した秒数後に SIGALRM シグナルを送信するタイマであるpcntl_alarmなど危険性が高い関数を無効にできる
指定できるのは、内部関数だけで、ユーザ定義関数は指定できない。また、セーフモードの影響を受けない

<?php
 echo(pcntl_get_last_error()); 
?>

実行すると
[Mon Nov 04 00:04:24 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: pcntl_get_last_error() has been disabled for security reasons in /var/www/htdocs/o.php on line 2

disable_classes =

特定のクラスをセキュリティの観点から無効にすることができる

<?php
// 現在のスクリプトで宣言されたクラスの名前の配列を返す
print_r(get_declared_classes());
$objDateTime = new DateTime('NOW');
var_dump($objDateTime);
?>

disable_classes = datetimeとするとエラーとなる
エラーメッセージは以下
[Sun Nov 03 01:23:45 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: datetime() has been disabled for security reasons in /var/www/htdocs/u.php on line 11
[Sun Nov 03 01:23:45 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Stack trace:
[Sun Nov 03 01:23:45 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP 1. {main}() /var/www/htdocs/u.php:0

zend.enable_gc = On

循環参照コレクタを有効にするか否か

<?php
class Foo
{
    public $var = '3.1415962654';
}

$baseMemory = memory_get_usage();
# memory_get_usage : 現在の PHP スクリプトに割り当てられたメモリの量をバイト単位で返します
for ( $i = 0; $i <= 100000000; $i++ )
{
    $a = new Foo;
    $a->self = $a;
    if ( $i % 500 === 0 )
    {
        echo sprintf( '%8d: ', $i ), memory_get_usage() - $baseMemory, "\n";
    }
}
?>

12f37b1c6963c1c5c18f30495416a197-gc-benchmark
http://php.net/manual/ja/features.gc.performance-considerations.php
zend.enable_gc = Off
としたとき、メモリが解放されず、最終的にエラーとなった
[Thu Oct 31 21:49:26 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to alloca
te 72 bytes) in /var/www/htdocs/g.php on line 13

expose_php = On

PHP がサーバーにインストールされていることを全世界に晒し、PHP のバージョンも HTTP ヘッダに含めます
Onとした場合、X-Powered-ByというヘッダにPHPバージョンが表示される

telnet x.x.x.x 80
Trying x.x.x.x…
Connected to x.x.x.x.
Escape character is ‘^]’.
GET /k.php HTTP/1.1
User-Agent: Telnet [ja] (Linux)
Host: www.akat.info

HTTP/1.1 200 OK
Date: Tue, 29 Oct 2013 14:52:11 GMT
Server: Apache
X-Powered-By: PHP/5.4.4-14+deb7u5
Vary: Accept-Encoding
Transfer-Encoding: chunked
Content-Type: text/html

4
test
0

Connection closed by foreign host.

curl -I http://x.x.x.x でも確認可能

max_execution_time = 30

スクリプトがパーサにより強制終了されるまでに許容される最大の時間を秒単位で指定する
スクリプトがサーバーの負荷を上げることを防止するのに役立つ

<?php
 sleep(70); // 70秒間待ち 
 echo date("Y/m/d H:i:s")." -> end\n";
?>

max_execution_time が30秒のとき、上記スクリプトを実施するとクライアントには500エラーを返却し、内部では以下のエラー(mod_fcgidを利用)
[Thu Oct 31 21:18:43 2013] [warn] [client x.x.x.x] mod_fcgid: read data timeout in 40 seconds
[Thu Oct 31 21:18:43 2013] [error] [client x.x.x.x] Premature end of script headers: x.php

max_input_time = 60

PHPはスクリプト実行前に、GET、POST、ファイルアップロードデータを解析するが、その解析時間の最大秒数を決定する
サーバーがすべてのデータを受け取ってからスクリプトの実行を開始するまでの時間

memory_limit = 128M

スクリプトが確保できる最大メモリをバイト数で指定する

mod_fcgidだと以下のようなエラーとる
[Thu Oct 31 21:49:26 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to alloca
te 72 bytes) in /var/www/htdocs/g.php on line 13

error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

エラー出力レベルを設定します。パラメータは、あるビットフィールドを表す整数か定数名で指定する
E_ALL:サポートされる全てのエラーと警告。PHP5.4.0からE_STRICTレベルのエラーも含まれる。
E_DEPRECATED:実行時の注意。これを有効にすると、将来のバージョンで動作しなくなるコードについての警告を受け取ることができる。(PHP 5.3.0より)
E_STRICT:コードの相互運用性や互換性を維持するために PHP がコードの変更を提案する。(PHP 5より)

display_errors = Off

エラーをHTML出力の一部として画面に出力するかどうかを定義する

display_startup_errors = Off

PHPの起動シーケンスにおいて発生したエラーを表示する
display_errorsはPHPスクリプト実行中のエラー表示の可否を決めますが、display_startup_errorsはスクリプト実行前の、初期化時に発生するエラーに関係するディレクティブ

<?php print_r($_POST); ?>

display_startup_errors = On かつ post_max_sizeを10 とするとエラーが表示される
これはスクリプト実行前のポストデータを処理時のエラー(クライアントのリクエスト処理)となるため、display_startup_errorsがOnでないと表示されない
curl -X POST –data ‘key1=value1’ http://49.212.204.46/p.php

Warning: Unknown: POST Content-Length of 11 bytes exceeds the limit of 10 bytes in Unknown on line 0

Warning: Cannot modify header information – headers already sent in Unknown on line 0

Array
(
)

log_errors = On

エラーメッセージを、サーバーのエラーログまたはerror_logに記録するかどうかを指定する
エラー内容はサーバに依存するが、Onにする

log_errors_max_len = 1024

log_errorsの最大長をバイト単位で設定する

<?p
hp

?>

log_errors_max_len = 2 とした場合
Parse error: sy in /var/www/htdocs/r.php on line 2

ignore_repeated_errors = Off

繰り返されるメッセージを記録するかどうか

ignore_repeated_source = Off

メッセージの繰り返しを無視する場合にメッセージのソースを無視する

report_memleaks = On

このパラメータを On (デフォルト)にすると、Zendメモリマネージャーが検出したメモリリークの報告を表示する
error_reportingで E_WARNINGを有効にしている場合のみ有効となる

track_errors = Off

有効にした場合、直近のエラーメッセージが、$php_errormsg 変数に常に代入される

<?php
@strpos();
echo $php_errormsg;
?>

track_errors = On で実行した場合
strpos() expects at least 2 parameters, 0 given

track_errors = Off で実行した場合
Notice: Undefined variable: php_errormsg in /var/www/htdocs/d.php on line 3

html_errors = On

エラーメッセージのHTMLタグをオフにする
パフォーマンス上およびセキュリティ上の理由から、本番サーバー上ではこの設定を無効にする事が推奨されている

html_errors = On の場合
Parse error: syntax error, unexpected ‘hp’ (T_STRING) in /var/www/htdocs/r.php on line 2

html_errors = Off の場合
Parse error: syntax error, unexpected ‘hp’ (T_STRING) in /var/www/htdocs/r.php on line 2

variables_order = “GPCS”

EGPCS (Environment (環境変数)、 Get、Post、 Cookie (クッキー)、そして Server) 変数のパースの順番を設定します
例えば variables_orderを”SP” に設定すると、PHPは superglobals $_SERVER および $_POSTを作成しますが、$_ENV、$_GET および $_COOKIE は作成しない

<?php
 var_dump($_ENV); 
 var_dump($_GET); 
 var_dump($_POST); 
 var_dump($_COOKIE);
 var_dump($_SERVER); 
?>

variables_order = “EGPCS” のとき
curl -X POST –data ‘key1=value1’ http://x.x.x.x/h.php
array(34) {
[“PATH”]=>
string(28) “/usr/local/bin:/usr/bin:/bin”
[“PHP_FCGI_CHILDREN”]=>
……
}
array(0) {
}
array(1) {
[“key1”]=>
string(6) “value1”
}
array(0) {
}
array(34) {
[“PATH”]=>
string(28) “/usr/local/bin:/usr/bin:/bin”
[“PHP_FCGI_CHILDREN”]=>
……
}

variables_order = “GCS” のとき
curl -X POST –data ‘key1=value1’ http://x.x.x.x/h.php
array(0) {
}
array(0) {
}
array(0) {
}
array(0) {
}
array(34) {
[“PATH”]=>
string(28) “/usr/local/bin:/usr/bin:/bin”
[“PHP_FCGI_CHILDREN”]=>
……
}

curl -G –data ‘key1=value1’ http://x.x.x.x/h.php
array(0) {
}
array(1) {
[“key1”]=>
string(6) “value1”
}
array(0) {
}
array(0) {
}
array(34) {
[“PATH”]=>
string(28) “/usr/local/bin:/usr/bin:/bin”
[“PHP_FCGI_CHILDREN”]=>
……
}

request_order = “GP”

PHP が GET 変数や POST 変数そしてクッキー変数を _REQUEST 配列に登録する際の順序を表す
$_REQUESTは、現在の $_GET、$_POST、$_COOKIE などの内容をまとめたスーパーグローバル変数のひとつで連想配列でデータを保持する(ただし、デフォルト設定ではセキュリティのためクッキー変数は含まれていない)

<?php
 var_dump($_GET); 
 var_dump($_POST); 
 var_dump($_REQUEST); 
?>

curl –data ‘key_p=post’ http://x.x.x.x/q.php?key_g=get
array(1) {
[“key_g”]=>
string(3) “get”
}
array(1) {
[“key_p”]=>
string(4) “post”
}
array(2) {
[“key_g”]=>
string(3) “get”
[“key_p”]=>
string(4) “post”
}

request_order = “GP” の場合
curl –data ‘key=post’ http://x.x.x.x/q.php?key=get
array(1) {
[“key”]=>
string(3) “get”
}
array(1) {
[“key”]=>
string(4) “post”
}
array(1) {
[“key”]=>
string(4) “post”
}

request_order = “PG” の場合
curl –data ‘key=post’ http://x.x.x.x/q.php?key=get
array(1) {
[“key”]=>
string(3) “get”
}
array(1) {
[“key”]=>
string(4) “post”
}
array(1) {
[“key”]=>
string(3) “get”
}

register_argc_argv = Off

PHPが変数argvとargcを宣言するかどうかを指定する(これらにはGETの情報が格納される)
argc:スクリプトに渡したコマンドライン引数の数
argv:スクリプトに渡したコマンドライン引数の配列

<?php
 var_dump($_SERVER["argv"]); 
?>

register_argc_argv = Off のとき以下のエラー
Notice: Undefined index: argv in /var/www/htdocs/a.php on line 2 NULL

auto_globals_jit = On

有効にした場合、SERVER および ENV 変数はスクリプトの開始時ではなく、最初に使用された時(Just In Time) に作成される
これらの変数がスクリプトの中で使用されない場合、 性能が向上する

post_max_size = 8M

POSTデータに許可される最大サイズを設定
PHPではPOSTメソッドおよびGETメソッドでリクエストデータを受信すると、自動的にそのデータを配列変数に格納する(つまり、メモリ空間を利用する)

<?php
 print_r($_POST); 
?>

curl -X POST –data ‘key1=value1’ http://x.x.x.x/p.php
Array
(
[key1] => value1
)
ここでpost_max_sizeを10とすると、PHPではpost_max_sizeの設定で制限した値を超えたデータを送信すると、リクエストデータすべてが無視されるため空白となる
curl -X POST –data ‘key1=value1’ http://x.x.x.x/p.php
Array
(
)

エラーメッセージには
[Thu Oct 31 23:39:27 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: Unknown: POST Content-Length of 11 bytes exceeds the limit of 10 bytes in Unknown on line 0

auto_prepend_file =

メインファイルの前に自動的に付加されるファイルの名前を指定する
つまり、自動でrequire関数が実行される
特別な値 none を指 定すると、ファイルを前に追加する機能は無効となる

<?php
 echo "start"; 
?>

auto_prepend_file = /var/www/htdocs/c.php
と指定すると、他のPHPファイル実行時に’start’の記述が追加された

auto_append_file =

メインファイルの後に自動的に追加されるファイルの名前を指定する
スクリプトがexit()で終了する場合、 この自動付加機能は利用できない

default_mimetype = “text/html”

PHP は、デフォルトで常にContent-type:ヘッダでcharacter encodingを出力する
デフォルトのmimetypeを決定する
ほとんどのアプリケーションはtext/htmlがデフォルト設定であることを前提としているため、そのままのほうがよい

curl -I http://x.x.x.x/r.php
HTTP/1.1 200 OK
Date: Sat, 02 Nov 2013 17:31:37 GMT
Server: Apache
Content-Type: text/html

doc_root =

サーバーにおけるPHPの”ルートディレクトリ”です。この値は空で無い場合のみ使用される
apacheのルートディレクトリと階層が違う場合は、うまく動作しなくなる
apacheのルートディレクトリを”/var/www/htdocs”
doc_root = “/var/www/htdocs/test”としたとき
http://x.x.x.x/k.php にアクセスすると
/var/www/htdocs/test/k.php にアクセスする
この際に/var/www/htdocs/test/k.php が存在しても
/var/www/htdocs/k.php が存在しなければ404エラー
また/var/www/htdocs/k.php が存在しても
この際に/var/www/htdocs/test/k.php が存在しなければ、
“No input file specified.”エラーが発生する

user_dir =

PHPファイル用にユーザーのホームディレクトリとして使用する基本ディレクトリ名
★?

enable_dl = Off

Apacheモジュール版のPHPを使用した場合にのみ有用
PHPの動的ロード拡張機能を dl()で仮想サーバー毎またはディレクトリ毎にオンまたはオフに変更可能

file_uploads = On

HTTP ファイルアップロード を有効とするかどうか
※ファイルそのものは変数には格納せず、ファイル名やファイルサイズなどの情報を変数に格納し、ファイルはファイルシステムに書き込む仕様となっている

upload_max_filesize = 2M

アップロードされるファイルの最大サイズ(バイト単位)
★うまくいかず
dd if=/dev/zero of=100M.file bs=1024 count=102400
curl -X POST –form data=/home/shimizu/100M.file http://49.212.204.46/index.php
http://www.atmarkit.co.jp/ait/articles/1201/30/news132.html

max_file_uploads = 20

同時にアップロードできるファイルの最大数。 PHP 5.3.4 以降、何もファイルを指定せずに送信されたアップロードフィールドは ファイル数に数えられなくなりました。

allow_url_fopen = On

URL対応のfopenラッパーが使用可能となり、ファイルのようにURLオブジェクトをにアクセスできるようになる

<?php
$fp=fopen('http://www.google.co.jp','r');
while ($line = fgets($fp)){
echo "$line";
}
fclose($fp);
?>

allow_url_fopen = Off としたとき、URL越しのfopenはエラーとなる
[Sun Nov 03 18:28:08 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: fopen(): http:// wrapper is disabled in the server configuration by allow_url_fopen=0 in /var/www/htdocs/f.php on line 3
[Sun Nov 03 18:28:08 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: fopen(http://www.google.co.jp): failed to open stream: no suitable wrapper could be found in /var/www/htdocs/f.php on line 3
[Sun Nov 03 18:28:08 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: fgets() expects parameter 1 to be resource, boolean given in /var/www/htdocs/f.php on line 4
[Sun Nov 03 18:28:08 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: fclose() expects parameter 1 to be resource, boolean given in /var/www/htdocs/f.php on line 7

allow_url_include = Off

このオプションを指定するとinclude, include_once, require, require_once でURL対応のfopenラッパーが使用できるようになる

default_socket_timeout = 60

ソケットベースのストリームのデフォルトの有効時間(単位は秒)を定義する

<?php
$homepage = file_get_contents('http://8.8.8.8');
echo $homepage;
?>

default_socket_timeout = 1 としたとき、URLが強引ですが、、1秒後にエラー
Warning: file_get_contents(http://8.8.8.8): failed to open stream: Connection timed out in /var/www/htdocs/n.php on line 2
エラーメッセージは以下
[Sun Nov 03 23:51:56 2013] [warn] [client x.x.x.x] mod_fcgid: stderr: PHP Warning: file_get_contents(http://8.8.8.8): failed to open stream: Connection timed out in /var/www/htdocs/n.php on line 2