作業環境は、なるべく本番に近づけておく
管理しているサイトで、作業環境(XAMPP)を使って テーマのページビルダーの記事を直していたときのことです。部品が多い記事を保存すると、一部の部品が保存されずに消えてしまい、本番では起きない動きになることがありました。作業環境と本番で動きが違うと、検証で見つけたいことを見落としたり、本番にない問題を追いかけたりしてしまいます。
作業環境は、なるべく本番に近い設定にしておくほうが、検証のときに問題を見つけやすくなります。そこで今回は、PHP の設定(php.ini)の値を、本番のエックスサーバーと同じにそろえました。
原因の 1 つは max_input_vars
調べてみると、作業環境の php.ini の値が、本番より小さいものがいくつかありました。なかでも影響が大きかったのが max_input_vars です。これは 1 回の送信で PHP が受け取る入力の数の上限で、上限をこえた分は捨てられてしまいます。
ページビルダーは、部品ごとに多くの入力欄を送ります。部品が多い記事ほど入力の数がふえるので、上限が小さい作業環境では、後ろのほうの部品が保存されないことになります。エラーの画面は出ないため、気づきにくいところです。
合わせた値
本番の値は、エックスサーバーのサーバーパネルの「php.ini 設定」で見られます。そこに出ている値に合わせて、作業環境の php.ini を次のようにしました。
| 設定 | 合わせた値 | 意味 |
|---|---|---|
max_input_vars |
10000 | 1 回の送信で受け取る入力の数の上限 |
memory_limit |
1G | 1 回の処理で使えるメモリの上限 |
post_max_size |
1G | 送信できるデータ全体の大きさの上限 |
upload_max_filesize |
1G | アップロードできる 1 ファイルの大きさの上限 |
max_input_time |
-1 | 送られたデータを受け取るのにかけてよい時間(-1 は制限なし) |
手順
1. 本番の値を見る
サーバーパネルの「php.ini 設定」を開き、対象のドメインの値をメモしておきます。PHP のバージョンを切り替えている場合は、本番で使っているバージョンの値を見るようにします。
2. 作業環境の php.ini をバックアップしてから書き換える
XAMPP の php.ini は、ふつう C:\xampp\php\php.ini にあります。書き換える前に、同じフォルダに php.ini.before-日付 のような名前でコピーしておくと、うまく動かなかったときにすぐ戻せます。
copy C:\xampp\php\php.ini C:\xampp\php\php.ini.before-YYYYMMDD
バックアップができたら、php.ini の該当する行を書き換えます。行の頭に ; が付いているときはコメントになっているので、; を外してから値を入れます。
max_input_vars = 10000 memory_limit = 1G post_max_size = 1G upload_max_filesize = 1G max_input_time = -1
| 書き方 | 役目 |
|---|---|
max_input_vars = 10000 |
ページビルダーの部品が多くても、入力が捨てられないようにする |
post_max_size = 1G |
upload_max_filesize と同じか、それより大きくしておく |
max_input_time = -1 |
大きなデータを受け取るときに、時間切れで止まらないようにする |
気をつけたいのが、ファイルの改行です。XAMPP の php.ini は改行が CRLF になっていることがあり、sed コマンドの -i などでその場で書き換えると、改行が LF に変わってしまう場合があります。PHP は読めても、ファイル全体に差分が出て、あとで見比べにくくなります。改行を保ったまま書き換えられるエディタで直すのが安全です。
3. Apache を再起動する
php.ini は Apache の起動のときに読まれるので、書き換えただけでは反映されません。XAMPP のコントロールパネルで Apache を Stop してから Start し直します。
4. 値が変わったかを確かめる
確かめ方は 2 つあります。1 つは、phpinfo() を出すページを作業環境に置いて、ブラウザで開く方法です。もう 1 つは、ini_get() で値だけを出す方法で、こちらは表示が短く、見比べやすくなります。
<?php
$keys = array( 'max_input_vars', 'memory_limit', 'post_max_size', 'upload_max_filesize', 'max_input_time' );
foreach ( $keys as $key ) {
echo $key . ' = ' . ini_get( $key ) . PHP_EOL;
}
| 書き方 | 役目 |
|---|---|
$keys |
確かめたい設定の名前を並べる |
ini_get( $key ) |
いま PHP が使っている値を取り出す |
PHP_EOL |
1 つずつ改行して出す |
ブラウザで開くと、Apache の PHP が読んでいる値が出ます。合わせた値になっていれば完了で、確かめ終えたら、このファイルは消しておきます。phpinfo() のページも、サーバーの情報が多く出るので、置きっぱなしにしないようにします。
気をつけること
- XAMPP では、コマンドラインの PHP と Apache の PHP が同じ php.ini を読むことが多いですが、環境によっては別のファイルを読むこともあります。ブラウザで開いて確かめると確実です
- 本番の値は、サーバーパネルで変えられます。本番の値を変えたときは、作業環境の php.ini もあわせて直しておきます
- 作業環境だけ値を大きくしすぎると、本番で起きる問題を見落とします。大きくするのではなく、本番と同じにするのが目的です
まとめ
- 作業環境を本番に近づけておくと、検証のときに問題を見つけやすい
- ページビルダーの部品が保存されないときは、
max_input_varsの上限をうたがう - 本番の値はサーバーパネルの「php.ini 設定」で見て、作業環境の php.ini をバックアップしてから同じ値にする
- 改行を変えないように、エディタで書き換える。Apache を再起動して、
phpinfo()かini_get()で確かめる


