# 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. 明示的に括弧で囲わずに三項演算子をネストする 1 ? 2 : 3 ? 4 : 5;
  2. 波括弧を使った、配列や文字列のオフセットへのアクセス $var{$idx}
  3. (real) によるキャストと is_real() 関数
  4. $this が使われている場合に、$this のバインドを解除
  5. 親クラスがない場合における parent キーワードの利用
  6. php.ini における allow_url_include オプション
  7. 基数を変更する関数における不正な文字
  8. オブジェクトに対する array_key_exists() 関数
  9. get_magic_quotes_gpc() や get_magic_quotes_runtime() 関数
  10. hebrevc() 関数
  11. convert_cyr_string() 関数
  12. money_format() 関数
  13. ezmlm_hash() 関数
  14. restore_include_path() 関数
  15. Implode 関数の、歴史的なパラメータ順序変更
  16. 大文字小文字を区別せず、定数を登録することで型のライブラリをインポートすること
  17. FILTER_SANITIZE_MAGIC_QUOTES
  18. mb_ereg_replace() に文字列でないパターンを渡すこと
  19. mb_strrpos() 関数に、3 番目のパラメーターとしてエンコーディングを渡す
  20. ldap_control_paged_result_response() と ldap_control_paged_result() 関数
  21. ReflectionType::__toString()
  22. ReflectionNamedType::getName()
  23. Reflection クラスの全ての export() メソッド
  24. 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

コードの事前ロード (opens new window)

# 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
2020-09-12
  • php

関連記事

Laravel メンテナンスモード
Laravel でカテゴリー作成 テーブル構築と再帰クエリ
Laravel を API サーバーとしての初期設定
Laravel リクエストログ出力
Carbon で php date 日付の日数・月数差を計算
Laravel 429 Too Many Requests
Laravel Email バリデーションについて
Laravel Sanctum 使って API トークン JWT 認証と SPA 認証
Laravel logger でエラーログを chatwork に自動送信
php CSV データ取得は fgetcsv 使う
Laravel tinker 使って DB データベース接続とコマンド
Laravel Test についてのメモ
Laravel Log の基本設定&使い方
Exception: Class 'ZipArchive' not found
Laravel Sail で Docker 環境構築
PHP 文字列長さ・文字列の幅を取得方法
Codeigniter 画像アップロードとリサイズ
Laravel Lumen Faker 日本語設定
laravel method の基本 get post put options
Laravel schedule 設定
Class 'Imagick' not found Error
Laravel eloquent model の規約
PHP mbconvertkana 全角半角英数カナ変換
Codeigniter APPPATH BASEPATH FCPATH 各種パスと URL 取得
Laravel timestamp() auto update 有効化無効化
Lumen8 で JWT ユーザー認証
Laravel toSql パラメータ付きで出力
Lumen8 で API 開発
php Exception エラーキャッチでメール送信
Smarty HTTP URL 取得できるサーバー関数
Laravel blade foreach loop と current url
laravel session を制する
PHP empty isset is_null の違い
PHP 8 リリース新機能と変更
FlattenException deprecated
php.ini 初期設定のいろいろ
Laravel 5.1 から 8.1 にバージョンアップ
開発時によく使うゼロ埋めパディング作業まとめ
解決!phpMyAdmin テーブル構造の内容が表示されない問題
codeigniter email ライブラリでメール送信 日本語対応
Composer コマンドとオプション
爆速軽量フレームワーク codeigniter PHP 開発
nuxtjs と codeigniter で jwt システム構築
Lumen と Laravel 違い比較
HTML から PDF に変換 PHP ライブラリ mPDF の設定
twig 3 人気 PHP テンプレートエンジンがバージョンアップ
正規表現一覧 よく使う検索・置換のパターン
Apache 初期設定メモ
開発におけるコーディングルール・規約
Laravel Error についてのメモ
laravel に vuejs 使うための初期設定
php curl 使って クリックなしで POST 送信
allowurlinclude の設定で ftp_connect()エラー