Ubuntu に、PHPの環境をインストール方法

Ubuntu に、PHPの環境をインストール方法

複数のバージョンをインストールして、alternativesで切り替えられるようにします。

インストール手順

リポジトリ追加

sudo add-apt-repository ppa:ondrej/php 

のコマンドを実行します。

Press [ENTER] to continue or Ctrl-c to cancel adding it.

と表示されたら、Enterキーを押します。

apt update

sudo apt update

PHPをインストール

ここでは、本ページ執筆時点で最新の、8.0をインストールします。

sudo apt install -y php8.0

他に、複数バージョンの切り替えを確認するため、本ページ執筆時点で有効な、7.3、7.4もインストールします。

sudo apt install -y php7.3
sudo apt install -y php7.4

PHPモジュールをインストール

sudo apt search php8.0-*

を実行すると、

libapache2-mod-php8.0/focal 8.0.10-1+ubuntu20.04.1+deb.sury.org+1 amd64
  server-side, HTML-embedded scripting language (Apache 2 module)

libphp8.0-embed/focal 8.0.10-1+ubuntu20.04.1+deb.sury.org+1 amd64
  HTML-embedded scripting language (Embedded SAPI library)

php8.0/focal 8.0.10-1+ubuntu20.04.1+deb.sury.org+1 all
  server-side, HTML-embedded scripting language (metapackage)

php8.0-amqp/focal 1.10.2-8+ubuntu20.04.1+deb.sury.org+1 amd64
  AMQP extension for PHP

php8.0-apcu/focal 5.1.20+4.0.11-1+ubuntu20.04.1+deb.sury.org+1 amd64
  APC User Cache for PHP

php8.0-ast/focal 1.0.14-1+ubuntu20.04.1+deb.sury.org+1 amd64
  AST extension for PHP 7
・
・
・

のように、インストール可能なモジュールが表示されるので、必要なモジュールをインストールする。

例:MySQLを使う場合

sudo apt install -y php8.0-mysql

alternativesでバージョン切り替え

定義

sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.3 100
sudo update-alternatives --install /usr/bin/php php /usr/bin/php7.4 110
sudo update-alternatives --install /usr/bin/php php /usr/bin/php8.0 120

切り替え方法

Priorityを選択して切り替える方法

sudo update-alternatives --config php
There are 3 choices for the alternative php (providing /usr/bin/php).

  Selection    Path             Priority   Status
------------------------------------------------------------
  0            /usr/bin/php8.0   120       auto mode
  1            /usr/bin/php7.3   100       manual mode
  2            /usr/bin/php7.4   110       manual mode
* 3            /usr/bin/php8.0   120       manual mode

Press <enter> to keep the current choice[*], or type selection number: 

のように表示されるので、Selectionの番号を入れてEnterキーを押すと、そのバージョンが有効になります。
※上記はPHP 8.0が有効になっている状態です。

php -v
PHP 8.0.10 (cli) (built: Aug 26 2021 15:50:07) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.10, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.10, Copyright (c), by Zend Technologies

のように、選択したバージョンになっていればOKです。

コマンドで直接設定する方法

7.4を有効にする場合:

sudo update-alternatives --set php /usr/bin/php7.4
php -v
PHP 7.4.23 (cli) (built: Aug 26 2021 15:51:37) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.23, Copyright (c), by Zend Technologies

のように、選択したバージョンになっていればOKです。

WSL2 Ubuntu 20.04でのxdebug用の設定

WSL2 Ubuntu 20.04にPHPを入れ、XDebugを有効にしてデバッグしたので、備忘録のため、その手順をまとめます。

WSL2 Ubuntu 20.04での設定

phpX.X-xdebug(PHP8.0の場合、php8.0-xdebug)をaptでインストールします。

apt install -y php8.0-xdebug

次に、xdebugの設定ファイルを編集します。
php8.0の場合:/etc/php/8.0/mods-available/xdebug.ini

まず、

zend_extension=xdebug.so

の設定をコメントアウトします。

; zend_extension=xdebug.so

次に、末尾に下記を追加します。

zend_extension="/usr/lib/php/20200930/xdebug.so"

xdebug.log=/tmp/xdebug.log
xdebug.mode=debug
xdebug.start_with_request=yes
xdebug.client_port=9003

xdebug.remote_enable = 1
xdebug.remote_connect_back = 1
xdebug.remote_autostart = 1

なお、zend_extensionのパスはバージョンによって異なるので、xdebug.soのファイルを検索して、絶対パスを設定します。

php 非同期でexec するには

php 非同期でexec するには=>
PHPでバックグラウンドプロセスを実行する簡単な方法

PHPでは、システムコマンドを背景で実行する方法があります。以下のスクリプトは、5秒間待機するsleepコマンドをバックグラウンドで実行します。

<?php
$command = 'sleep 5';
$commandInBackground = $command . ' > /dev/null 2>&1 &';
exec($commandInBackground);
echo "コマンドがバックグラウンドで実行されました。\n";
?>
    

このスクリプトを使うことで、PHPはコマンドの完了を待たずに他の処理を続けることができます。

シェルコマンドの出力制御の理解

> /dev/null 2>&1 &はUNIX系システムで用いられる、出力制御のための重要なシンタックスです。この構文の役割は以下の通りです:

  • > /dev/null: コマンドの標準出力をnullデバイスにリダイレクトし、すべての出力を破棄します。
  • 2>&1: 標準エラー出力を標準出力と同じ場所(この場合はnullデバイス)にリダイレクトします。これにより、エラーメッセージも破棄されます。
  • &: コマンドをバックグラウンドで実行し、PHPスクリプトを即座に次の処理に移行させます。

注意点と利用シーン

この方法は、非同期処理を実現するのに役立ちますが、出力が完全に無視されるためデバッグが難しくなります。エラートラッキングやデバッグが必要な場合は、他の方法を検討することをお勧めします。

<