# PHP 7.4 にアップグレードして使えなくなる機能
2020 年 10 月 31 日に php バージョンが 7.1 以下の AWS プラットフォーム廃止する予定!
ついに AWS から php5.6 などの古い php バージョンが消えます。
Elastic Beanstalk では 64bit Amazon Linux の以下の PHP プラットフォームバージョンのリタイアが予定されています。
| PHP バージョン | AMI | 言語 | Composer | WEB サーバー | 終了日 |
|---|---|---|---|---|---|
| PHP 7.1 バージョン 2.9.9 | 2018.03.0 | PHP 7.1.33 | 1.9.0 | Apache 2.4.43 | 2020/10/31 |
| PHP 7.0 バージョン 2.9.9 | 2018.03.0 | PHP 7.0.33 | 1.9.0 | Apache 2.4.43 | 2020/10/31 |
| PHP 5.6 バージョン 2.9.9 | 2018.03.0 | PHP 5.6.40 | 1.9.0 | Apache 2.4.43 | 2020/10/31 |
| PHP 5.5 バージョン 2.9.9 | 2018.03.0 | PHP 5.5.38 | 1.9.0 | Apache 2.4.43 | 2020/10/31 |
| PHP 5.4 バージョン 2.9.9 | 2018.03.0 | PHP 5.4.45 | 1.9.0 | Apache 2.4.43 | 2020/10/31 |
Beanstalk の PHP プラットフォームは PHP 7.2 以降は nginx と apache 両方サポート、デフォルト nginx になっています。
# 7.4 で推奨されない機能と変更
- 明示的に括弧で囲わずに三項演算子をネストする
1 ? 2 : 3 ? 4 : 5; - 波括弧を使った、配列や文字列のオフセットへのアクセス
$var{$idx} - (real) によるキャストと is_real() 関数
- $this が使われている場合に、$this のバインドを解除
- 親クラスがない場合における parent キーワードの利用
- php.ini における allow_url_include オプション
- 基数を変更する関数における不正な文字
- オブジェクトに対する array_key_exists() 関数
- get_magic_quotes_gpc() や get_magic_quotes_runtime() 関数
- hebrevc() 関数
- convert_cyr_string() 関数
- money_format() 関数
- ezmlm_hash() 関数
- restore_include_path() 関数
- Implode 関数の、歴史的なパラメータ順序変更
- 大文字小文字を区別せず、定数を登録することで型のライブラリをインポートすること
- FILTER_SANITIZE_MAGIC_QUOTES
- mb_ereg_replace() に文字列でないパターンを渡すこと
- mb_strrpos() 関数に、3 番目のパラメーターとしてエンコーディングを渡す
- ldap_control_paged_result_response() と ldap_control_paged_result() 関数
- ReflectionType::__toString()
- ReflectionNamedType::getName()
- Reflection クラスの全ての export() メソッド
- socket_addrinfo_lookup() 関数の AI_IDN_ALLOW_UNASSIGNED と AI_IDN_USE_STD3_ASCII_RULES フラグ
# 7.4 の新機能
バージョンアップでは使わないけど、魅力的な機能がリリースされているようです。
# 型付きプロパティ
型宣言をサポートするようになりました。
class User {
public int $id;
public string $name;
}
# アロー関数
javascript や typescript の es6 文法に似ているような感じで使えやすくしたアロー関数
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
# Null 合体代入演算子
$array['key'] ??= computeDefault();
// は、以下にほぼ等しい
if (!isset($array['key'])) {
$array['key'] = computeDefault();
}
# 配列内での値のアンパック
これも javascript にあるので、たまに php で誤って書いたりします!php7.4 ならもうエラーがでなくなります。非常に助かる便利機能!
$parts = ['apple', 'pear'];
$fruits = ['banana', 'orange', ...$parts, 'watermelon'];
// ['banana', 'orange', 'apple', 'pear', 'watermelon'];
# 数値リテラルのセパレータ
桁と桁の間にアンダースコアを挿入できるようになりました。
6.674_083e-11; // float
299_792_458; // decimal
0xCAFE_F00D; // hexadecimal
0b0101_1111; // binary
# OPcache コードを事前ロードする機能
PHP 7.4.0 以降では、エンジンの起動時に opcache に事前ロードするスクリプトを指定できるようになりました。 指定されたファイルに存在する (関数やクラスなどの) あらゆるシンボルは、 明示的にインクルードすることなく全てのリクエストからグローバルに利用できるようになります。 これにより(コードが常に利用できるようになるため)、メモリ使用量と、 パフォーマンスおよび便利さのトレードオフが発生します。 事前ロードされたスクリプトをクリアするには PHP プロセスの再起動が必要です。 つまり、この機能は本番環境でのみ役に立ちます。開発環境では役に立ちません。
パフォーマンスとメモリ使用量の最適なトレードオフは、アプリケーションによって異なることに注意して下さい。 "全てをあらかじめ読み込む" ことはもっとも簡単な戦略かもしれませんが、 必ずしも最適とは限りません。 さらに、コードの事前ロードは、リクエストが終了しても継続して生き残るプロセスの場合にだけ役に立ちます。 つまり、opcache が有効になった CLI スクリプトは動作はしますが、 一般的にコードの事前ロードは役に立ちません。 但し、FFI 経由でコードの事前ロードを使う場合は例外です。
注意:
コードの事前ロードは、Windows ではサポートされていません。
コードの事前ロードを設定するには、2 つのステップが必要です。 まず、opcache を有効にしなければなりません。 その上で、opcache.preload の値を php.ini に設定します。
opcache.preload=preload.php
# Amazon Linux AMI サポート 2020 年 10 月 31 日まで延長
元々 2020 年 10 月 31 日までの予定でしたが、流石に対応が間に合わないインスタンスが多いでしょうか、Amazon は Linux AMI のサポートを 2020 年 12 月 31 日までに延長するそうです。
メンテナンスサポート
2020 年 12 月 31 日を過ぎると Amazon Linux AMI には新たにメンテナンスサポート期間が設定されます (2023 年 6 月 30 日まで継続)。
この新たなメンテナンスサポート期間中は、
- Amazon Linux AMI には重要、重大なセキュリティアップデートだけが縮小パッケージセットとして提供されます。
- ただし、新しい EC2 プラットフォームキャパシティーや AWS の新機能に対するサポートは保証されません。
サポート対象パッケージは次のとおりです。
- Linux カーネル
- 低レベルのシステムライブラリ (glibc や openssl など)
- アップストリームソースで今もサポート対象となっている主要なパッケージ (MySQL や PHP など)
これまでのプロジェクトの保守なら 2023 年 6 月までそのまま使えるようです。
# php5 から php7 にアップグレード
# php 削除
yum remove php-*
# php 74
yum install --enablerepo=remi,remi-php74 php php-devel php-mbstring php-pdo php-gd php-xml php-mcrypt php-mysqlnd
# バージョン確認
php -v
# PHP 7.4.16 (cli) (built: Mar 2 2021 10:35:17) ( NTS )
# Copyright (c) The PHP Group
# Zend Engine v3.4.0, Copyright (c) Zend Technologies
# php.ini 編集
vi /etc/php.ini
date.timezone = "Asia/Tokyo"
mbstring.language = Japanese
mbstring.internal_encoding = UTF-8
mbstring.http_input = UTF-8
mbstring.http_output = pass
mbstring.encoding_translation = On
mbstring.detect_order = auto
mbstring.substitute_charset = none
# composer2.0 install
# composer download
curl -sS https://getcomposer.org/installer | php
# All settings correct for using Composer
# Downloading...
#
# Composer (version 2.0.11) successfully installed to: //composer.phar
# Use it: php composer.phar
# composer2.0 有効化
mv composer.phar /usr/local/bin/composer
# バージョン確認
composer -v
______
/ ____/___ ____ ___ ____ ____ ________ _____
/ / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/
/ /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ /
\____/\____/_/ /_/ /_/ .___/\____/____/\___/_/
/_/
Composer version 2.0.11 2021-02-24 14:57:23