11月26日にPHPのメジャーバージョン「8.0」がリリースされたので導入してみた
こんにちは、コンサル部@大阪オフィスの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]/ にアクセスをして表示される事を確認します。
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を使って試してみたいと思います。