11月26日にPHPのメジャーバージョン「8.0」がリリースされたので導入してみた

2020.11.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、コンサル部@大阪オフィスのTodaです。

11月26日にPHPのメジャーバージョン「8.0」がリリースされました。
メジャーバージョンアップということで言語仕様の見直しやコードの実行時間を短縮するため頻繁に利用されるコードをコンパイルして実行時間を短縮できる機能(JIT)など実装されているようです。
まずは試してみたいということでサクッと導入をしてみたいと思います。

前提条件

  • AmazonLinux2のAMIを利用したEC2インスタンスを新規起動して利用します。
  • テストのためセキュリティに関する設定なしで進めます。

目標

  • WebサーバとPHP8を導入してPHPinfoをブラウザ画面に表示する。

事前確認

11月28日時点では、amazon-linux-extrasにはPHP8はないためPHP8が利用できるYumリポジトリを設定して対応いたします。

$ sudo amazon-linux-extras list

15  php7.2                   available    \
        [ =7.2.0  =7.2.4  =7.2.5  =7.2.8  =7.2.11  =7.2.13  =7.2.14
          =7.2.16  =7.2.17  =7.2.19  =7.2.21  =7.2.22  =7.2.23
31  php7.3                   available    \
        [ =7.3.2  =7.3.3  =7.3.4  =7.3.6  =7.3.8  =7.3.9  =7.3.10
42  php7.4                   available    [ =stable ]

実際やってみる

Apache httpdのインストール

Yumコマンドを利用してApacheをインストールします。

$ sudo yum install httpd

EPEL / Remiリポジトリのインストール

PHP8を導入するため、EPELとRemiのYumリポジトリを追加します。

$ sudo amazon-linux-extras install epel
$ sudo yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm

YumリポジトリにPHP8があるか確認

YumリポジトリにPHP8があるか確認をします。
確認をしたところ「php80」という名称で登録されていることがわかりました。

$ yum search php80
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
199 packages excluded due to repository priority protections
========================================= N/S matched: php80 ==========================================
php80-php-pecl-http-message-devel.x86_64 : php80-php-pecl-http-message developer files (headers)
php80-php-pecl-psr-devel.x86_64 : php80-php-pecl-psr developer files (header)
php80-php-pecl-raphf-devel.x86_64 : php80-php-pecl-raphf developer files (header)
php80-php-pecl-xmldiff-devel.x86_64 : php80-php-pecl-xmldiff developer files (header)
php80-php-pecl-yaconf-devel.x86_64 : php80-php-pecl-yaconf developer files (header)
php80-php-zstd-devel.x86_64 : php80-php-zstd developer files (header)
php80-runtime.x86_64 : Package that handles php80 Software Collection.
php80-scldevel.x86_64 : Package shipping development files for php80
php80.x86_64 : Package that installs PHP 8.0
php80-build.x86_64 : Package shipping basic build configuration
php80-php.x86_64 : PHP scripting language for creating dynamic web sites
php80-php-ast.x86_64 : Abstract Syntax Tree
php80-php-bcmath.x86_64 : A module for PHP applications for using the bcmath library
php80-php-brotli.x86_64 : Brotli Extension for PHP
php80-php-cli.x86_64 : Command-line interface for PHP
php80-php-common.x86_64 : Common files for PHP
php80-php-componere.x86_64 : Composing PHP classes at runtime
php80-php-dba.x86_64 : A database abstraction layer module for PHP applications
php80-php-dbg.x86_64 : The interactive PHP debugger
php80-php-devel.x86_64 : Files needed for building PHP extensions
php80-php-embedded.x86_64 : PHP library for embedding in applications
php80-php-enchant.x86_64 : Enchant spelling extension for PHP applications
php80-php-ffi.x86_64 : Foreign Function Interface
php80-php-fpm.x86_64 : PHP FastCGI Process Manager
php80-php-gd.x86_64 : A module for PHP applications for using the gd graphics library
php80-php-geos.x86_64 : PHP module for GEOS
php80-php-gmp.x86_64 : A module for PHP applications for using the GNU MP library
php80-php-imap.x86_64 : A module for PHP applications that use IMAP
php80-php-intl.x86_64 : Internationalization extension for PHP applications
php80-php-json.x86_64 : JavaScript Object Notation extension for PHP
php80-php-ldap.x86_64 : A module for PHP applications that use LDAP
php80-php-litespeed.x86_64 : LiteSpeed Web Server PHP support
php80-php-lz4.x86_64 : LZ4 Extension for PHP
php80-php-maxminddb.x86_64 : MaxMind DB Reader extension
php80-php-mbstring.x86_64 : A module for PHP applications which need multi-byte string handling
php80-php-mysqlnd.x86_64 : A module for PHP applications that use MySQL databases
php80-php-oci8.x86_64 : A module for PHP applications that use OCI8 databases
php80-php-odbc.x86_64 : A module for PHP applications that use ODBC databases
php80-php-opcache.x86_64 : The Zend OPcache
php80-php-pdlib.x86_64 : A PHP extension for Dlib
php80-php-pdo.x86_64 : A database access abstraction module for PHP applications
php80-php-pdo-dblib.x86_64 : PDO driver for Microsoft SQL Server and Sybase databases
php80-php-pdo-firebird.x86_64 : PDO driver for Interbase/Firebird databases
php80-php-pear.noarch : PHP Extension and Application Repository framework
php80-php-pecl-amqp.x86_64 : Communicate with any AMQP compliant server
[行が多いため php80-php-pecl-**** は省略]
php80-php-pgsql.x86_64 : A PostgreSQL database module for PHP
php80-php-phpiredis.x86_64 : Client extension for Redis
php80-php-process.x86_64 : Modules for PHP script using system process interfaces
php80-php-pspell.x86_64 : A module for PHP applications for using pspell interfaces
php80-php-realpath-turbo.x86_64 : Use realpath cache despite open_basedir restriction
php80-php-smbclient.x86_64 : PHP wrapper for libsmbclient
php80-php-snappy.x86_64 : Snappy Extension for PHP
php80-php-snmp.x86_64 : A module for PHP applications that query SNMP-managed devices
php80-php-soap.x86_64 : A module for PHP applications that use the SOAP protocol
php80-php-sodium.x86_64 : Wrapper for the Sodium cryptographic library
php80-php-sqlsrv.x86_64 : Microsoft Drivers for PHP for SQL Server
php80-php-tidy.x86_64 : Standard PHP module provides tidy library support
php80-php-xml.x86_64 : A module for PHP applications which use XML
php80-php-xmlrpc.x86_64 : A module for PHP applications which use the XML-RPC protocol
php80-php-zstd.x86_64 : Zstandard extension
php80-unit-php.x86_64 : PHP module for NGINX Unit
php80-xhprof.noarch : A Hierarchical Profiler for PHP - Web interface

PHP8と必要モジュールをインストール

PHP本体と必要なモジュールをインストールします。
※MySQLとGDモジュールは当記事では利用しませんが、あとあと利用するため導入します。

$ sudo yum -y install php80 php80-php php80-php-mbstring php80-php-pdo php80-php-xml php80-php-fpm php80-php-mysqlnd php80-php-gd

導入後、PHP80コマンドでバージョン表示をしてみます。

$ php80 -v
PHP 8.0.0 (cli) (built: Nov 24 2020 17:04:03) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies

Apacheを起動する

インストール作業が終わりましたので1度Apacheを起動してみます。

$ sudo systemctl start httpd.service

[自動起動を有効にする場合は下記も実行]
$ sudo systemctl enable httpd.service

phpinfo() を表示してみる

初期設定の公開ディレクトリ(/var/www/html)にphpファイルを作成してphpinfo()を表示します。

sudo vi /var/www/html/index.php

[下記の内容を入力して保存]
<?php phpinfo(); ?>

ブラウザで確認してみる

ブラウザで http://[グローバルIP]/ にアクセスをして表示される事を確認します。

php8 phpinfo

PHP Version 8.0.0 の画面が表示されればインストールが正常に完了しています。

変更点をいくつか確認してみる

新機能や変更点についてはPHPのマニュアルをご確認ください。
PHP 7.4.x から PHP 8.0.x への移行

比較演算子 == の挙動変更

数値と文字列(数値以外)を比較した場合の挙動が変わります。
この仕様変更はif判定で厳密な比較を利用していない場合に影響がでそうです。

PHP RFC: Saner string to number comparisons

[PHP8]
var_dump("ABC" == 0);
false

[PHP7]
var_dump("ABC" == 0);
true

新しいPHP関数

str_contains

検索対象の文字列の中に、指定の文字列が存在するかを調べます。
PHP7まではstrposなどを利用して対応していた処理に利用できます。

str_contains ( string $haystack , string $needle ) : bool

[PHP8]
$str = "aaabbbccc";
if (str_contains($str, "abb")) {
	echo "exist";
} else {
	echo "not exist";
}
出力:exist

[PHP7]
$str = "aaabbbccc";
if (strpos($str, "abb") !== false) {
	echo "exist";
} else {
	echo "not exist";
}
出力:exist

str_starts_with / str_ends_with

str_starts_with
文字列が指定された部分文字列で始まるかを調べる。 大文字小文字も区別されます。

str_ends_with
文字列が、指定された文字列で終わるかを調べる。 大文字小文字も区別されます。

str_starts_with ( string $haystack , string $needle ) : bool
str_ends_with ( string $haystack , string $needle ) : bool

[PHP8]
$str = "AaaBbbCcc";
var_dump(str_starts_with($str, "Aaa"));
出力:true

var_dump(str_starts_with($str, "aaa"));
出力:false

さいごに

今回はPHP8の導入をしてみました。
PHP8はJITなど速度を上げる仕組みがあり別の機会にLaravelを使って試してみたいと思います。