PHPの設定に関して対応に困った点やトラブルが発生した項目、PHP更新時の注意点等を備忘としてまとめています。
※目次をクリックすると目次の下部にコンテンツが表示されます。
- 1.php.iniの保存場所
- 2.セキュリティに関わる設定
- 3.PHP実行中に”Maximum execution time of 30 seconds exceeded”
- 4.PHP7.2への更新時に下位互換性のない変更点
- 5.PHP7.3への更新時に下位互換性のない変更点
- 6.PHP7.4への更新時に下位互換性のない変更点
php.iniの保存場所
php.iniファイルの保存場所は以下の方法で確認できます。
〇CentOS6.9、PHP 7.1.8(RPM版)での確認例
〇CentOS6.9、PHP 7.1.8(RPM版)での確認例
$ rpm -qc php | grep php.ini $ rpm -qc php-common | grep php.ini /etc/php.ini
phpパッケージ内にあるファイルかと思ったのですが、php-commonというパッケージ内にありました。
セキュリティに関わる設定
PHP実行中に”Maximum execution time of 30 seconds exceeded”
PHPのプログラム実行中に下記エラーが発生しました。
Fatal error: Maximum execution time of 30 seconds exceeded
PHPの処理時間が30秒を超えるとこのようなエラーが出るようです。
この30秒の設定は、php.iniで設定されています。
0を指定すると、タイムアウトせずにずっと待ち続けるようです。
(php.iniの設定変更)
変更前
max_execution_time = 30;
変更後
max_execution_time = 0;
Fatal error: Maximum execution time of 30 seconds exceeded
PHPの処理時間が30秒を超えるとこのようなエラーが出るようです。
この30秒の設定は、php.iniで設定されています。
0を指定すると、タイムアウトせずにずっと待ち続けるようです。
(php.iniの設定変更)
変更前
max_execution_time = 30;
変更後
max_execution_time = 0;
PHP7.2への更新時に下位互換性のない変更点
PHP7.1以前のバージョンは、以下の記事参照
CentOS6でPHP5.3からPHP7.1へアップデート
※PHP7.2: 下位互換性のない変更点 – Manual
〇number_format() は負のゼロを返さない
・以前は”-0″を返せた。
例)
var_dump(number_format(-0.01)); // string(2) “-0” ではなく string(1) “0” となります
〇オブジェクトと配列の型変換における数値キーの扱い
・数値キーの配列をオブジェクトにキャストしたときに、その要素にアクセスできるようになった。
・オブジェクトに数値のキーが含まれる場合に、 配列にキャストしてもその要素にアクセスできるようになった。
〇get_class() に null を渡せない
・以前のバージョンでは、get_class() に null を渡すと、そのコンテキストの外側のクラスを返していた。
→この機能は削除され、null を渡すと E_WARNING が発生するようになった。
・以前と同様の挙動を実現したい場合は、null を渡すのではなく単にパラメータを省略するようにする。
〇countable ではない型をカウントしたときの警告
・countable ではない型に対して count() (およびそのエイリアスである sizeof()) を使ったときに E_WARNING が発生するようになった。
〇is_object() と __PHP_Incomplete_Class
・以前のバージョンでは、 __PHP_Incomplete_Class クラスに対して、 is_object() を使うと false が返されていた。
→これからは true が返される。
〇定義されていない定数のエラーレベル変更
・定義されていない定数への参照を行った場合、 E_WARNING を生成するようになった。 (今までは E_NOTICEを生成していました。)
〇array_unique() 関数を SORT_STRING と使う場合
・array_unique() 関数を SORT_STRING と使う場合、以前は配列をコピーし、重複した要素を削除 (配列を後にパックせずに) していた。
→このバージョンからは 新しい配列作られ、ユニークな要素を追加するようになった。
〇bcmod() の小数点に対する挙動変更
・bcmod() 関数が小数点切り捨てをしないようになた。
→これからは、挙動は % 演算子ではなく、 fmod()に準拠する。
例)
bcmod(‘4’, ‘3.5’) はいままでの1ではなく、 0.5 を返す。
〇ハッシュ関数と非暗号化ハッシュ
・hash_hmac()、 hash_hmac_file()、 hash_pbkdf2()、 および hash_init() ( HASH_HMAC) は非暗号化ハッシュを受け入れないように変更された。
〇json_decode() 関数のオプション
・json_decode() 関数のオプション、 JSON_OBJECT_AS_ARRAY は、2番めのパラメータ (assoc) が null の場合に使用されるようになった。
・JSON_OBJECT_AS_ARRAY はこれまで無視されていた。
〇date_parse() と date_parse_from_format() 関数への変更
・date_parse() 関数 と date_parse_from_format() 関数 が返す zone 要素は、 分ではなくて秒を表現するようになり、符号も逆になった。
例)
-120 分は 7200 秒を意味するようになった。
CentOS6でPHP5.3からPHP7.1へアップデート
※PHP7.2: 下位互換性のない変更点 – Manual
〇number_format() は負のゼロを返さない
・以前は”-0″を返せた。
例)
var_dump(number_format(-0.01)); // string(2) “-0” ではなく string(1) “0” となります
〇オブジェクトと配列の型変換における数値キーの扱い
・数値キーの配列をオブジェクトにキャストしたときに、その要素にアクセスできるようになった。
・オブジェクトに数値のキーが含まれる場合に、 配列にキャストしてもその要素にアクセスできるようになった。
〇get_class() に null を渡せない
・以前のバージョンでは、get_class() に null を渡すと、そのコンテキストの外側のクラスを返していた。
→この機能は削除され、null を渡すと E_WARNING が発生するようになった。
・以前と同様の挙動を実現したい場合は、null を渡すのではなく単にパラメータを省略するようにする。
〇countable ではない型をカウントしたときの警告
・countable ではない型に対して count() (およびそのエイリアスである sizeof()) を使ったときに E_WARNING が発生するようになった。
〇is_object() と __PHP_Incomplete_Class
・以前のバージョンでは、 __PHP_Incomplete_Class クラスに対して、 is_object() を使うと false が返されていた。
→これからは true が返される。
〇定義されていない定数のエラーレベル変更
・定義されていない定数への参照を行った場合、 E_WARNING を生成するようになった。 (今までは E_NOTICEを生成していました。)
〇array_unique() 関数を SORT_STRING と使う場合
・array_unique() 関数を SORT_STRING と使う場合、以前は配列をコピーし、重複した要素を削除 (配列を後にパックせずに) していた。
→このバージョンからは 新しい配列作られ、ユニークな要素を追加するようになった。
〇bcmod() の小数点に対する挙動変更
・bcmod() 関数が小数点切り捨てをしないようになた。
→これからは、挙動は % 演算子ではなく、 fmod()に準拠する。
例)
bcmod(‘4’, ‘3.5’) はいままでの1ではなく、 0.5 を返す。
〇ハッシュ関数と非暗号化ハッシュ
・hash_hmac()、 hash_hmac_file()、 hash_pbkdf2()、 および hash_init() ( HASH_HMAC) は非暗号化ハッシュを受け入れないように変更された。
〇json_decode() 関数のオプション
・json_decode() 関数のオプション、 JSON_OBJECT_AS_ARRAY は、2番めのパラメータ (assoc) が null の場合に使用されるようになった。
・JSON_OBJECT_AS_ARRAY はこれまで無視されていた。
〇date_parse() と date_parse_from_format() 関数への変更
・date_parse() 関数 と date_parse_from_format() 関数 が返す zone 要素は、 分ではなくて秒を表現するようになり、符号も逆になった。
例)
-120 分は 7200 秒を意味するようになった。
PHP7.3への更新時に下位互換性のない変更点
※PHP7.3: 下位互換性のない変更点 – Manual
〇ヒアドキュメント/Nowdoc の終了ラベルの解釈
・ヒアドキュメント/Nowdoc の文法が柔軟になった ことにより、本体の内部に終了ラベルが含まれた ドキュメンテーション文字列は、エラーが発生するか、解釈の振る舞いが変わる可能性がある。
〇switch の制御フローを変更する continue 文は警告が出る
・switch の制御フローを変更することを狙った continue 文は、警告が出るようになった。
・PHP では、このような continue 文は break と同等で、他のプログラミング言語では continue 2 と同じように振る舞うのとは対照的。
〇ArrayAccess を実装したオブジェクトに対する、 数値形式の文字列キーの解釈が厳密に
・$obj が ArrayAccess を実装したオブジェクトで、 “123” が数値の文字列リテラルだった場合、 この “123” は暗黙のうちに整数型に変換されなくなった。
〇static なプロパティが参照の代入によって分裂しなくなった
・PHP では、子クラスで明示的にオーバーライドされない限り、static なプロパティが継承関係にあるクラスの間で共有されるが、 実装上の副作用により、参照を代入することによって、static なプロパティが異なる値になる可能性があった。こうした抜け穴がこのバージョンでは修正された。
〇配列から返される参照とプロパティのアクセスは、即座に分割される
・配列から返された参照と、プロパティのアクセスは、 アクセスの一部として別に扱われるようになった。
→配列へのアクセスと、配列の値を使う間に、値を変更できなくなった。
〇TypeError
・integer と boolean ではなく、 それぞれ int と bool を誤った型として報告するようになる。
〇外部から入力されるCookie
・PHP 7.3.23 以降は、セキュリティ上の理由により、 外部から入力される Cookie の 名前 はurlデコードされなくなった。
〇ヒアドキュメント/Nowdoc の終了ラベルの解釈
・ヒアドキュメント/Nowdoc の文法が柔軟になった ことにより、本体の内部に終了ラベルが含まれた ドキュメンテーション文字列は、エラーが発生するか、解釈の振る舞いが変わる可能性がある。
〇switch の制御フローを変更する continue 文は警告が出る
・switch の制御フローを変更することを狙った continue 文は、警告が出るようになった。
・PHP では、このような continue 文は break と同等で、他のプログラミング言語では continue 2 と同じように振る舞うのとは対照的。
〇ArrayAccess を実装したオブジェクトに対する、 数値形式の文字列キーの解釈が厳密に
・$obj が ArrayAccess を実装したオブジェクトで、 “123” が数値の文字列リテラルだった場合、 この “123” は暗黙のうちに整数型に変換されなくなった。
〇static なプロパティが参照の代入によって分裂しなくなった
・PHP では、子クラスで明示的にオーバーライドされない限り、static なプロパティが継承関係にあるクラスの間で共有されるが、 実装上の副作用により、参照を代入することによって、static なプロパティが異なる値になる可能性があった。こうした抜け穴がこのバージョンでは修正された。
〇配列から返される参照とプロパティのアクセスは、即座に分割される
・配列から返された参照と、プロパティのアクセスは、 アクセスの一部として別に扱われるようになった。
→配列へのアクセスと、配列の値を使う間に、値を変更できなくなった。
〇TypeError
・integer と boolean ではなく、 それぞれ int と bool を誤った型として報告するようになる。
〇外部から入力されるCookie
・PHP 7.3.23 以降は、セキュリティ上の理由により、 外部から入力される Cookie の 名前 はurlデコードされなくなった。
PHP7.4への更新時に下位互換性のない変更点
※PHP7.4: 下位互換性のない変更点 – Manual
〇配列でない値を配列スタイルでアクセスした場合
・null, bool, int, float または resource 型を ($null[“key”] のように) 配列としてアクセスしようとすると、警告が生成されるようになった。
〇get_declared_classes() 関数
・まだインスタンス化されていない無名クラスを返さなくなった。
〇fread()、fwrite() 関数
・操作に失敗した場合に false を返すようになった。
・以前は空文字列か 0 を返していた。
・EAGAIN/EWOULDBLOCK は、失敗と見做されない。
・読み取り専用のリソースに書き込もうとして失敗したような場合に E_NOTICE を発生させるようになった。
〇Regular Expressions (Perl互換)
・PREG_UNMATCHED_AS_NULL モードが使われた場合、後に続くマッチしなかったキャプチャグループにも null (offset キャプチャが有効になっていた場合は [null, -1] になる) が設定されるようになった。
→$matches のサイズが常に同じになることを意味する。
〇外部から入力されるCookie
・PHP 7.4.11 以降は、セキュリティ上の理由により、 外部から入力される Cookie の 名前 はurlデコードされなくなった。
〇配列でない値を配列スタイルでアクセスした場合
・null, bool, int, float または resource 型を ($null[“key”] のように) 配列としてアクセスしようとすると、警告が生成されるようになった。
〇get_declared_classes() 関数
・まだインスタンス化されていない無名クラスを返さなくなった。
〇fread()、fwrite() 関数
・操作に失敗した場合に false を返すようになった。
・以前は空文字列か 0 を返していた。
・EAGAIN/EWOULDBLOCK は、失敗と見做されない。
・読み取り専用のリソースに書き込もうとして失敗したような場合に E_NOTICE を発生させるようになった。
〇Regular Expressions (Perl互換)
・PREG_UNMATCHED_AS_NULL モードが使われた場合、後に続くマッチしなかったキャプチャグループにも null (offset キャプチャが有効になっていた場合は [null, -1] になる) が設定されるようになった。
→$matches のサイズが常に同じになることを意味する。
〇外部から入力されるCookie
・PHP 7.4.11 以降は、セキュリティ上の理由により、 外部から入力される Cookie の 名前 はurlデコードされなくなった。
-
インストール、設定
- PHPの設定、更新時の参考情報メモ
- PHPのインストール
- CentOS6でPHP5.3からPHP7.1へアップデート
- CentOS6.10でPHP7.1からPHP7.2へアップデート
- CentOS Stream9でPHP7.4をインストールする手順
- CentOSでPHPのマルチバイト文字列(MBstring)関数を使えるようにする
- PHPでタイムスタンプをログファイルに記録
- PHPのバージョンが表示されないようにする
- セキュリティを考慮した/etc/php.iniの設定
- CentOS6でAPC(Alternative PHP Cache)をインストール、チューニング
- PHPスクリプトで出力データを圧縮する方法
- PHPの変数、スコープ
- PHPの型の概要、種類
- PHPのクラス操作の概要
- PHPの配列操作の概要
- PHPで文字列のマッチング
- require,require_once,include,include_onceの違い
- CentOS環境のPHPでPDOを使ってMySQLからJSONでデータ取得
- PHPでHTMLテーブルをJSONに変換
- PHPでディレクトリ内のファイル一覧をJSONで出力
- PDOを使ってテーブルに保存
- PDOでSQLインジェクション対策
- phpとpChartを使ってWebサイトにグラフ表示
性能
プログラミングの基本
PDO、データベース、JSON
その他