PHP7.4 開発用と本番用の php.ini 設定の違い

PHP をインストールすると `php.ini-development` と `php.ini-production` の2つのファイルが用意されていますが、どのような違いがあるのか分からなかったので diff を取ってみました。

## 環境

- PHP 7.4.5

## diff する

```shell-session
$ docker run php:7.4.5-cli diff -u /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini-production > diff.txt
```

## diff 結果

```diff
--- /usr/local/etc/php/php.ini-development	2020-04-17 11:30:36.000000000 +0000
+++ /usr/local/etc/php/php.ini-production	2020-04-17 11:30:36.000000000 +0000
@@ -83,7 +83,7 @@
 ; development version only in development environments, as errors shown to
 ; application users can inadvertently leak otherwise secure information.
 
-; This is the php.ini-development INI file.
+; This is the php.ini-production INI file.
 
 ;;;;;;;;;;;;;;;;;;;
 ; Quick Reference ;
@@ -363,7 +363,9 @@
 
 ; Allows to include or exclude arguments from stack traces generated for exceptions
 ; Default: Off
-zend.exception_ignore_args = Off
+; In production, it is recommended to turn this setting on to prohibit the output 
+; of sensitive information in stack traces
+zend.exception_ignore_args = On
 
 ;;;;;;;;;;;;;;;;;
 ; Miscellaneous ;
@@ -460,7 +462,7 @@
 ; Development Value: E_ALL
 ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
 ; http://php.net/error-reporting
-error_reporting = E_ALL
+error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
 
 ; This directive controls whether or not and where PHP will output errors,
 ; notices and warnings too. Error output is very useful during development, but
@@ -477,7 +479,7 @@
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/display-errors
-display_errors = On
+display_errors = Off
 
 ; The display of errors which occur during PHP's startup sequence are handled
 ; separately from display_errors. PHP's default behavior is to suppress those
@@ -488,7 +490,7 @@
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/display-startup-errors
-display_startup_errors = On
+display_startup_errors = Off
 
 ; Besides displaying errors, PHP can also log errors to locations such as a
 ; server-specific log, STDERR, or a location specified by the error_log
@@ -525,7 +527,9 @@
 ; This setting is on by default.
 ;report_zend_debug = 0
 
-; Store the last error/warning message in $php_errormsg (boolean).
+; Store the last error/warning message in $php_errormsg (boolean). Setting this value
+; to On can assist in debugging and is appropriate for development servers. It should
+; however be disabled on production servers.
 ; This directive is DEPRECATED.
 ; Default Value: Off
 ; Development Value: Off
@@ -1186,7 +1190,7 @@
 
 ; Enable / Disable collection of memory usage statistics by mysqlnd which can be
 ; used to tune and monitor MySQL operations.
-mysqlnd.collect_memory_statistics = On
+mysqlnd.collect_memory_statistics = Off
 
 ; Records communication from all extensions using mysqlnd to the specified log
 ; file.
@@ -1559,7 +1563,7 @@
 ; Development Value: 1
 ; Production Value: -1
 ; http://php.net/zend.assertions
-zend.assertions = 1
+zend.assertions = -1
 
 ; Assert(expr); active by default.
 ; http://php.net/assert.active
@@ -1586,8 +1590,6 @@
 ; http://php.net/assert.quiet-eval
 ;assert.quiet_eval = 0
 
-
-
 [COM]
 ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
 ; http://php.net/com.typelib-file
@@ -1881,7 +1883,7 @@
 
 ; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
 ; This should improve performance, but requires appropriate OS configuration.
-;opcache.huge_code_pages=0
+;opcache.huge_code_pages=1
 
 ; Validate cached file permissions.
 ;opcache.validate_permission=0
```

### zend.exception_ignore_args

- development は `Off`、production は `On`
- 有効にすると例外のスタックトレースに引数情報が出なくなる
- PHP7.4以降の設定

### error_reporting

http://php.net/error-reporting

エラー出力レベルを設定します。

- development は `E_ALL`、production は `E_ALL & ~E_DEPRECATED & ~E_STRICT`
- E_ALL は 全ての PHP エラーを表示する
- E_ALL & ~E_DEPRECATED & ~E_STRICT は 非推奨の警告エラーを除く PHP エラーを表示する
  - E_DEPRECATED は コードの相互運用性や互換性を維持するために PHP がコードの変更を提案する
  - E_STRICT は 実行時の注意、将来のバージョンで動作しなくなるコードについて警告する
- https://www.php.net/manual/ja/errorfunc.constants.php

### display_errors

http://php.net/display-errors

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

- development は `On`、production は `Off`
- セキュリティ上、本番では `Off` 推奨

### display_startup_errors

http://php.net/display-startup-errors

display_errorsをonにした場合でも、PHPの起動シーケンスにおいて発生したエラーは表示されません。

- development は `On`、production は `Off`
- セキュリティ上、本番では `Off` 推奨

### mysqlnd.collect_memory_statistics

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

さまざまなメモリ統計情報の収集を有効にします。

- development は `On`、production は `Off`
- `phpinfo()` で `mysqli` の統計情報を出力するかどうか

### zend.assertions

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

アサーションのコードを生成して実行します

- development は `1`、production は `-1`
- 1 アサーションのコードを生成して実行します (開発モード)
- 0 アサーションのコードは生成しますが実行時にはスキップします (実行しません)
- -1 アサーションのコードを生成せず、アサーションのコストがゼロになります (実運用モード)

### opcache.huge_code_pages

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

PHPコード(textセグメント)を HUGE PAGE にコピーする機能を有効にしたり、無効にしたりできます。

- development は `0`、production は `1`
- パフォーマンスは向上するはずですが、適切なOSの設定が必要です。

(適切なOSの設定って何...？ わからないので 0 にしてます。)

## 参考

- https://github.com/php/php-src/blob/master/php.ini-development
- https://github.com/php/php-src/blob/master/php.ini-production