「インストール - PHP」の版間の差分

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
 
(同じ利用者による、間の74版が非表示)
1行目: 1行目:
== 概要 ==
== 概要 ==
CentOSやSUSEの標準リポジトリにあるPHPのバージョンは古いことが多い。<br>
PHPは1995年にRasmus Lerdorfによって開発された主にWebアプリケーション開発のために設計されたプログラミング言語である。<br>
また、PHP 7以降は大幅な改良がされており、実行速度をはじめ様々なものがアップデートされているので、特別な事情がない限りはアップグレードした方がよい。<br>
当初は「Personal Home Page」の略称であったが、現在は「PHP: Hypertext Preprocessor」という再帰的な頭字語として知られている。<br>
<br>
PHPの最も重要な特徴は、HTMLに直接埋め込むことができることである。<br>
<syntaxhighlight lang="html">
<html>
  <body>
    <?php
      echo "Hello, World!";
    ?>
  </body>
</html>
</syntaxhighlight>
<br>
また、PHPはサーバサイドで動作する言語である。<br>
つまり、Webブラウザからリクエストが来る時、サーバ上でPHPコードが実行されてその結果生成されたHTMLがWebブラウザに送信される。<br>
この特性により、データベース操作やファイル処理等、サーバ側での複雑な処理を実現できる。<br>
<br>
PHPの強みとして、豊富な標準ライブラリがある。<br>
データベース接続、文字列処理、ファイル操作、画像処理等、Web開発に必要な機能の多くが標準で提供されている。<br>
特にMySQL等のデータベースとの連携が容易であり、多くのWebサイトやアプリケーションの開発に利用されている。<br>
<br>
フレームワークの面では、LaravelやSymfonyといった強力なフレームワークが存在しており、より効率的な開発を可能にしている。<br>
これらのフレームワークは、セキュリティ、パフォーマンス、保守性等の面で優れた機能を提供する。<br>
<br>
PHPの学習曲線は比較的緩やかで、初心者にも取り組みやすい言語である。<br>
基本的な文法は他の主要なプログラミング言語と似ており、特にC言語やJavaの経験がある方には馴染みやすい。<br>
<br>
セキュリティに関しては、最新のPHPバージョンでは多くの改善が行われている。<br>
ただし、開発者自身がセキュリティベストプラクティスを理解して、適切に実装することが重要である。<br>
例えばSQLインジェクションやクロスサイトスクリプティング (XSS) への対策は、必須の知識となる。<br>
<br>
<br>
Raspberry Piにおいて、ここでは、外部リポジトリとしてpackages.sury.org/phpを使用しているが、<br>
PHPは継続的に進化を続けており、現在のPHP 8系では、JITコンパイラの導入や型システムの強化等、パフォーマンスと開発体験の向上が図られている。<br>
このリポジトリを使用しても、常に最新版のPHPになる訳ではないことに注意すること。<br>
これにより、より堅牢で高速なアプリケーション開発が可能になっている。<br>
<br><br>
<br><br>


== リポジトリの追加 ==
== PHPのインストール (パッケージ管理システムからインストールする場合) ==
===== CentOS =====
==== RHEL ====
以下のページを参照して、EPELリポジトリとRemiリポジトリを追加する。<br>
もし、PHP 5がインストールされている場合は、PHP 5アンインストールする。<br>
[[YumリポジトリにEPELとRemiを追加する方法]]<br>
<br>
この時、php.iniファイルを変更している場合はバックアップを取得する。<br>
これは、新しいPHPをインストールした時点でphp.iniファイルが上書きされるためである。<br>
sudo dnf remove php-*
<br>
<br>
===== SUSE(不要) =====
次に、[[設定 - EPELリポジトリとRemiリポジトリ]]を参照して、EPELリポジトリとRemiリポジトリを追加する。<br>
以下のコマンドを実行して、Develリポジトリを追加する。<br>
<br>
# SUSE 15.1
<code>--enablerepo</code>オプションを付加して、PHPをインストールする。<br>
  sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/openSUSE_Leap_15.1/ php
アップデート後は、php.iniファイルが上書きされているのでバックアップから復元する。<br>
  sudo dnf --enablerepo=remi-php73 install php php-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php73-devel
# SUSE 15.2
<br>
sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/openSUSE_Leap_15.2/ php
==== SUSE ====
===== PHP 7をインストールする場合 (パッケージ管理システムのみ) =====
# SLE 15 SP1
PHPおよび主要なPHPモジュールをインストールする。<br>
  sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP1/ php
  sudo zypper install php7 php apache2-mod_php7 php7-curl php7-xmlreader php7-zip php7-pdo php7-gd php7-json php7-mysql php7-mbstring \
                    php7-openssl php7-pecl php7-devel php7-fpm php7-fileinfo php7-phar
<br>
<br>
Develリポジトリからダウンロードされるパッケージの優先度を設定するため、以下のコマンドを実行する。<br>
===== PHP 8をインストールする場合 =====
sudo zypper mr -p 70 php
* パッケージ管理システムからインストール
*: <code>sudo zypper install php8 php8-devel php8-curl php8-zip php8-mbstring php8-fileinfo php8-gd \</code>
*: <code>                    php8-mysql php8-fpm apache2-mod_php8</code>
*: <br>
* リポジトリを追加してインストール
*: まず、Develリポジトリを追加する。
*: SLE 15 SP5 : <code>sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP6/ PHP</code>
*: SLE 15 SP5 : <code>sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP5/ PHP</code>
*: SLE 15 SP4 : <code>sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP4/ PHP</code>
*: SLE 15 SP3 : <code>sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP3/ PHP</code>
*: <br>
*: Develリポジトリの優先度を高く設定する。
*: <code>sudo zypper mr -p 90 PHP</code>
*: <br>
*: リポジトリを更新する。
*: Develリポジトリを初めて使用する場合、GPGキーを受け入れるように求められる。
*: <code>sudo zypper refresh</code>
*: <br>
*: PHP 8をインストールする。
*: <code>sudo zypper install php8 apache2-mod_php8 php8-curl php8-xmlreader php8-zip php8-pdo php8-gd php8-json php8-mysql php8-mbstring \</code>
*: <code>                    php8-openssl php8-devel php8-fpm php8-fileinfo php8-phar</code>
<br>
<br>
次に、全てのリポジトリを更新する。<br>
SUSEのデフォルトのPHP-FPMは、<code>--with-fpm-user=wwwrun</code>オプションと<code>--with-fpm-group=www</code>オプションを付加してコンパイルされている。<br>
Develリポジトリを初めて使用する場合、GPGキーを受け入れるように求められる。<br>
ユーザ名がwwwrun、グループ名がwwwとなっている。<br>
sudo zypper refresh
<br>
<br>
===== Raspberry Pi =====
 
==== Raspberry Pi ====
まず、lsb-releaseをインストールする。<br>
まず、lsb-releaseをインストールする。<br>
  sudo apt-get install lsb-release
  sudo apt-get install lsb-release
45行目: 98行目:
外部リポジトリからインストール可能なPHPパッケージの情報を確認するため、以下のコマンドを実行する。<br>
外部リポジトリからインストール可能なPHPパッケージの情報を確認するため、以下のコマンドを実行する。<br>
  sudo apt-cache policy php
  sudo apt-cache policy php
<br>
PHP 7および主要なPHPモジュールをインストールするため、以下のコマンドを実行する。<br>
# PHP 7.3
sudo apt-get install php7.3 php7.3-fpm php7.3-mysql php7.3-mbstring php7.3-gd php7.3-zip php7.3-xml php7.3-common php7.3-curl php7.3-intl php-acpu
# PHP 7.4
sudo apt-get install php7.4 php7.4-cli php7.4-mysql php7.4-mbstring php7.4-gd php7.4-zip php7.4-xml php7.4-common php7.4-curl php7.4-intl
<br><br>
<br><br>


== PHP 7のインストール ==
== PHPのインストール (ソースコードからインストールする場合) ==
===== CentOS =====
==== c-clientライブラリのインストール (非推奨) ====
PHP 5をアンインストールするため、以下のコマンドを実行する。<br>
c-clientライブラリのビルドに必要なライブラリをインストールする。<br>
このとき、php.iniファイルを変更している場合はバックアップを取る。<br>
# RHEL
これは、新しいPHPをインストールした時点でphp.iniファイルが上書きされるためである。<br>
sudo dnf install make gcc openssl-devel pam-devel krb5-devel libksba-devel
  sudo yum remove php-*
# SUSE
sudo zypper install make gcc openssl-devel pam-devel krb5-devel libksba-devel
<br>
c-clientライブラリのソースコードをダウンロードする。<br>
git clone https://github.com/uw-imap/imap
cd imap
<br>
c-clientライブラリをビルドおよびインストールする。<br>
# OpenSSLをサポートする場合、かつ、PAMモジュールを使用する場合
make -j $(nproc) lnp SSLTYPE=unix
make install
# OpenSSLをサポートしない場合、かつ、PAMモジュールを使用する場合
make -j $(nproc) lnp
make install
# OpenSSLをサポートしない場合、かつ、PAMモジュールを使用しない場合
make -j $(nproc)
make install
<br>
c-clientライブラリのシンボリックリンクを作成する。<br>
ln -s /<IMAPのインストールディレクトリ>/lib/c-client.a \
      /<IMAPのインストールディレクトリ>/lib/libc-client.a
<br>
~/.profileファイル等に、c-clientライブラリのパスを設定する。<br>
vi ~/.profile
<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
export LD_LIBRARY_PATH="/<c-clientライブラリのインストールディレクトリ>/lib:$LD_LIBRARY_PATH"
export PKG_CONFIG_PATH="$(pkg-config --variable pc_path pkg-config)"
export PKG_CONFIG_PATH="/<c-clientライブラリのインストールディレクトリ>/lib/pkgconfig:${PKG_CONFIG_PATH}"
</syntaxhighlight>
<br>
 
==== PHPのインストール ====
RHELやSUSEの標準リポジトリにあるPHPのバージョンは古いことが多い。<br>
また、PHP 7以降は大幅な改良がされており、実行速度をはじめ様々なものがアップデートされているので、特別な事情がない限りはアップグレードした方がよい。<br>
<br>
Raspberry Piにおいて、ここでは、外部リポジトリとしてpackages.sury.org/phpを使用しているが、<br>
このリポジトリを使用しても、常に最新版のPHPになる訳ではないことに注意すること。<br>
<br>
また、複数のPHPのバージョンをインストールする場合、ソースコードからインストールする方が融通が利く。<br>
<br>
PHPのビルドに必要なライブラリをインストールする。<br>
sudo zypper install make gcc gcc-c++ ccache re2c gmp-devel pcre-devel pcre2-devel zlib-devel libzip-devel \
                    readline-devel libcurl-devel gd-devel libxml2-devel freetype2-devel enchant-devel    \
                    libjpeg62-devel libpng16-devel libwebp-devel libavif-devel libffi-devel              \
                    libXpm-devel libXft-devel libxslt-devel oniguruma-devel libsodium-devel libtidy-devel \
                    krb5-server krb5-devel imap imap-devel cyrus-sasl-devel        \
                    libedit-devel libcapstone-devel libxslt-devel argon2-devel icu libicu-devel          \
                    systemd-devel        \
                    libopenssl-1_1-devel \  # OpenSSL 1 を使用する場合
                    libopenssl-3-devel  \  # OpenSSL 3 を使用する場合
                    sqlite3-devel        \
                    unixODBC-devel      \
                    libmariadb-devel    \
                    libmysqld-devel      \
                    lmdb-devel          \  # BtreeベースのDBMSを使用する場合
                    postgresql17-devel      # PHP 8.4以降 : PostgreSQLを使用する場合
                    postgresql-devel        # PHP 8.4以前 : PostgreSQLを使用する場合
                    valgrind-devel          # Valgrind (メモリリーク検知機能) を有効にする場合
                    aspell-devel            # GNU ASpellを使用する場合
                    libc-client2007e_suse  # SUSE 15.5以前 (SUSE 15.6以降では、このパッケージは無くなっているため)
<br>
[https://www.php.net/downloads.php PHPの公式Webサイト]にアクセスして、PHPのソースコードをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
tar xf php-<バージョン>.tar.xz
cd php-<バージョン>
<br>
ビルド用ディレクトリを作成する。<br>
mkdir phpbuild && cd phpbuild
<br>
PHPをビルドおよびインストールする。<br>
<u>PHPのインストール後は、/Apache2のインストールディレクトリ>/modulesディレクトリにlibphp.soファイルもインストールされる。</u><br>
../configure --prefix=<PHPのインストールディレクトリ> \
              --enable-bcmath --enable-calendar --enable-cgi --enable-cli --enable-exif --enable-ftp --enable-fpm    \
              --enable-gd --enable-gd-jis-conv --enable-inifile --enable-intl --enable-mbregex --enable-mbstring      \
              --enable-mysqlnd --enable-opcache --enable-phpdbg --enable-phpdbg-debug --enable-sockets --with-enchant \
              --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-shmop --enable-soap --enable-zts            \
              --with-curl --with-expat -with-freetype --with-gettext --with-gmp --with-iconv --with-jpeg --with-avif --with-ffi \
              --with-openssl --with-mhash \
              --with-readline --with-sodium --with-tidy --with-xpm                    \
              --with-zlib --with-zip --with-libxml --with-xsl --with-ldap --with-pic  \
              --with-fpm-systemd        \
              --with-unixODBC=shared    \
              --with-mysql-sock        \
              --with-mysqli=mysqlnd    \  # MySQL拡張モジュールであるmysqliMySQL Native Driverでビルドする
              --with-pdo-mysql=mysqlnd  \  # MySQL拡張モジュールであるPDO MYSQLをMySQL Native Driverでビルドする
              --with-pgsql              \  # PostgresSQLを使用する場合
              --with-pdo-pgsql          \  # PostgresSQLを使用する場合
              --with-lmdb              \  # BtreeベースのDBMSを使用する場合
              --with-pear              \
              --with-pspell            \  # GNU ASpellを有効にする場合
              --with-valgrind          \  # Valgrind (メモリリーク検知機能) を有効にする場合
              --with-imap-ssl          \  # PHP 8.4以降は不要
              --with-kerberos          \  # PHP 8.4以降は不要
              --with-imap              \  # SUSE 15.5以前 (IMAPライブラリを使用する場合)
              --without-imap            \  # PHP 8.4以降は不要
                                          # Composer経由で利用できるメールライブラリが多数存在するため、システムのIMAPライブラリは不要
              --with-mcrypt            \  # PHP 7.2以降は削除されたため不要
              --with-libdir=lib64                              \
              --with-apxs2=/<Apacheのインストールディレクトリ>/bin/apxs \
              --with-config-file-path=<php.iniファイルの配置するディレクトリのパス  例: /home/user/PHP/lib> \  # ユーザが指定する場合
              --with-fpm-user=<PHP-FPMを実行するユーザ名>          \  # オプション
              --with-fpm-group=<PHP-FPMを実行するグループ名>          # オプション
make -j $(nproc)
make install
<br>
PHPの実行に必要なライブラリをインストールする。<br>
# SUSE
sudo zypper install libonig4
                    libpq5                # PostgresSQLを使用する場合
                    libaspell15            # GNU ASpellを使用する場合
                    libc-client2007e_suse  # SUSE 15.5以前
 
<br>
~/.profileファイル等に、環境変数<code>PATH</code>を追記する。<br>
vi ~/.profile
<br>
<syntaxhighlight lang="sh">
# ~/.profileファイル
export PATH="/<PHPのインストールディレクトリ>/bin:/<PHPのインストールディレクトリ>/sbin:$PATH"
</syntaxhighlight>
<br>
 
==== Apache2を使用する場合 ====
Apache2を使用する場合、Apache2の設定ファイルであるhttpd.confファイルを編集して、phpファイルを実行できるように設定する。<br>
vi /<Apacheの設定ファイルがあるディレクトリ>/conf/httpd.conf
<br>
<syntaxhighlight lang="apache">
# /<Apacheの設定ファイルがあるディレクトリ>/conf/httpd.confファイル
LoadModule php_module modules/libphp.so
<FilesMatch "\.php$">
    SetHandler application/x-httpd-php
</FilesMatch>
<IfModule php_module>
    DirectoryIndex index.html default.php index.php
    AddHandler application/x-httpd-php .php
</IfModule>
</syntaxhighlight>
<br>
==== PHPの設定 ====
次に、PHPの設定ファイルであるphp.iniファイルを設定する。<br>
php.iniファイルのデフォルトのパスは、/<PHPのインストールディレクトリ>/lib64ディレクトリである。<br>
<br>
なお、<code>php --ini</code>コマンドを実行することにより、php.iniファイルを配置するパスが表示される。<br>
<br>
<code>configure</code>スクリプト実行時に<code>--with-config-file-path=</code>オプションを指定することにより、php.iniファイルを配置するパスを変更することができる。<br>
<br>
php.iniファイルは、ダウンロードしたPHPのソースコードのトップディレクトリに存在するため、これをコピーする。<br>
cp /<PHPのソースコードがあるディレクトリ>/php.ini-development /<PHPのインストールディレクトリ>/lib64
<br>
==== PHP-FPMの全体の設定 ====
PHP-FPMを使用する場合、ソケットファイルが配置されるディレクトリを作成する。<br>
mkdir -p /<PHPのインストールディレクトリ>/var/run/php-fpm
<br>
これは、<code>configure</code>スクリプトの実行時に、<code>--enable-fpm</code>オプションを指定した場合、PHP-FPMライブラリがインストールされる。<br>
まず、php-fpm.confファイルを作成する。<br>
cd <PHPのインストールディレクトリ>/etc
cp php-fpm.conf.default php-fpm.conf
<br>
php-fpm.confでは、プロセスファイルやログのパス等を変更することができる。<br>
vi php-fpm.conf
<br>
<syntaxhighlight lang="ini">
# php-fpm.confファイル
; ...略
pid = <PHP-FPMのPIDファイルのパス 例. /var/run/php-fpm/php-fpm.pid>
error_log = <PHP-FPMのエラーログファイルのパス  例. /var/log/php-fpm/php-fpm.log>
; ...略
</syntaxhighlight>
<br>
==== PHP-FPMのプール設定 ====
Webアプリケーションを使用する場合、PHP-FPMのプール設定ファイルであるwww.confファイルを作成する。<br>
PHP-FPMを実行するには、使用するユーザアカウントを設定する必要がある。<br>
<br>
適切なアカウントを使用しない場合は、パーミッションエラーが発生する可能性がある。<br>
<br>
また、使用するアカウントは、OSやWebサーバによって異なる。<br>
<br>
例えば、NginXの場合、デフォルトの設定では<u>nginx</u>という名前のアカウントを使用する。 (ソースコードからインストールしている場合、オプションを付加して変更することができる)<br>
Apache2の場合、SUSEでは<u>wwwrun</u>、Ubuntu / Debianでは<u>www-data</u>、RHELでは<u>nobody</u>を使用する。<br>
<br>
以下の設定例は、NginXを使用したサーバの設定である。<br>
  cd /<PHPのインストールディレクトリ>/etc/php-fpm.d
cp www.conf.default www.conf
<br>
vi www.conf
<br>
<br>
次に、PHP 7をインストールする。<br>
ここでは、以下の設定を変更している。<br>
インストールは、--enablerepoオプションを付加して、以下のコマンドを実行する。<br>
<syntaxhighlight lang="ini">
アップデート後は、php.iniファイルが上書きされているのでバックアップから復元する。<br>
# www.confファイル
  sudo yum --enablerepo=remi-php73 install php php-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php73-devel
; ...略
user = <ユーザ名  例. nginx>
group = <グループ名  例. nginx>
; Unixドメインソケット (例: unix:/var/run/php-fpm/php-fpm.sock) を使用している場合は、
; listen.owner、listen.group、listen.modeも設定する
listen.owner = <ユーザ名  例. nginx>
listen.group = <グループ名  例. nginx>
  listen.mode  = 0660
; 通信方法の設定
; nginx.confファイルにおいても、同様の設定を行う必要がある (NginXの設定は、インストール - NginXのページを参照すること)
listen = <TCPまたはUnixドメインソケット>
          ;例1. TCPを使用する場合 : 127.0.0.1:9000
          ;例2. Unixドメインソケットを使用する場合 : /var/run/php-fpm/php-fpm.sock
; PHP-FPMがパース可能なメインスクリプトを拡張子で制限する(サーバ側の設定ミスによる被害を抑えることができる)
; PHP-FPMには、.php拡張子のみをパースできるようにする場合、悪意のあるユーザがその他の拡張子でphpのコードを実行しようとする試みを防ぐことができる
; デフォルト値 : .php .phar
security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8 .html
; PHP-FPM実行時のエラーログ
php_admin_value[error_log] = <PHP-FPMのプール設定向けログファイルのパス  例: /var/log/php-fpm/www.log>
php_admin_flag[log_errors] = on
php_admin_value[memory_limit] = 32M
php_flag[display_errors] = on
; ...略
</syntaxhighlight>
<br>
<br>
===== SUSE =====
必要ならば、PHP-FPMのアクセスファイルやログファイルを配置するディレクトリパスを変更または作成する。<br>
PHP 7およびいくつかの主要なPHPモジュールをインストールする。<br>
なお、<u>デフォルトの設定では、ログディレクトリのパスはPHPのインストールディレクトリ下にあるvar/log/php-fpm.logである。</u><br>
  sudo zypper install php7 php apache2-mod_php7 php7-curl php7-xmlreader php7-zip php7-pdo php7-gd php7-json php7-mysql php7-mbstring php7-openssl php7-pecl php7-devel php7-fpm apache2-mod_php7
  sudo mkdir /var/log/php-fpm
sudo chown <上記で設定したユーザ名>:<上記で設定したグループ名> /var/log/php-fpm
sudo mkdir /var/run/php-fpm
sudo chown -R <上記で設定したユーザ名>:<上記で設定したグループ名> /var/run/php-fpm
<br>
<br>


===== Raspberry Pi =====
==== PHP-FPMのSystemdサービスユニットの作成 ====
PHP 7およびいくつかの主要なPHPモジュールをインストールするため、以下のコマンドを実行する。<br>
PHP-FPMを使用する場合は、/etc/systemcd/systemディレクトリにSystemdサービスユニットを作成する。<br>
  # PHP 7.3
sudo vi /etc/systemcd/system/php-fpm.service
  sudo apt-get install php7.3 php7.3-fpm php7.3-mysql php7.3-mbstring php7.3-gd php7.3-zip php7.3-xml php7.3-common php7.3-curl php7.3-intl php-acpu
<br>
<syntaxhighlight lang="ini">
  # /etc/systemcd/system/php-fpm.serviceファイル
# It's not recommended to modify this file in-place, because it will be overwritten during upgrades.
# If you want to customize, the best way is to use the "systemctl edit" command.
[Unit]
Description=The PHP FastCGI Process Manager
After=network.target
  Before=apache2.service nginx.service lighttpd.service
[Service]
Type=simple
ExecStart=/<PHPのインストールディレクトリ>/sbin/php-fpm --nodaemonize --fpm-config /<PHPのインストールディレクトリ>/etc/php-fpm.conf
ExecReload=/bin/kill -USR2 $MAINPID
# Set up a new file system namespace and mounts private /tmp and /var/tmp directories,
# so this service cannot access the global directories and other processes cannot access this service's directories.
PrivateTmp=true
# Mounts the /usr, /boot, and /etc directories read-only for processes invoked by this unit.
ProtectSystem=full
# Sets up a new /dev namespace for the executed processes and only adds API pseudo devices
# such as /dev/null, /dev/zero or /dev/random (as well as the pseudo TTY subsystem) to it, but no physical devices such as /dev/sda.
PrivateDevices=true
# Explicit module loading will be denied. This allows to turn off module load and unload operations on modular kernels.
# It is recommended to turn this on for most services that do not need special file systems or extra kernel modules to work.
ProtectKernelModules=true
# Kernel variables accessible through /proc/sys, /sys, /proc/sysrq-trigger, /proc/latency_stats,
# /proc/acpi, /proc/timer_stats, /proc/fs and /proc/irq will be made read-only to all processes of the unit.
# Usually, tunable kernel variables should only be written at boot-time, with the sysctl.d(5) mechanism.
# Almost no services need to write to these at runtime; it is hence recommended to turn this on for most services.
ProtectKernelTunables=true
# The Linux Control Groups (cgroups(7)) hierarchies accessible through /sys/fs/cgroup will be made read-only to all processes of the unit.
# Except for container managers no services should require write access to the control groups hierarchies;
# it is hence recommended to turn this on for most services
ProtectControlGroups=true
# Any attempts to enable realtime scheduling in a process of the unit are refused.
RestrictRealtime=true
# Restricts the set of socket address families accessible to the processes of this unit.
# Protects against vulnerabilities such as CVE-2016-8655
RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
# Takes away the ability to create or manage any kind of namespace
RestrictNamespaces=true
   
   
  # PHP 7.4
  [Install]
  sudo apt-get install php7.4 php7.4-cli php7.4-mysql php7.4-mbstring php7.4-gd php7.4-zip php7.4-xml php7.4-common php7.4-curl php7.4-intl
WantedBy=multi-user.target
  </syntaxhighlight>
<br><br>
 
== PHP-FPMの設定ファイルとは ==
PHP-FPM (FastCGI Process Manager) は、PHPのFastCGI実装であり、WebサーバとPHPプロセスの間で通信を行う。<br>
PHP-FPMの設定は、主に2つのファイルで管理される。<br>
* php-fpm.conf : PHP-FPMの全体的な設定
*: php-fpm.confファイルは、PHP-FPM全体の設定を管理する。
*: <br>
*: 例えば、プロセスの挙動、ログの場所、マスタープロセスの設定等が含まれる。
*: php-fpm.confファイルは、PHP-FPMのコアの設定を定義するため、複数のプール (ポート番号、ユーザ、グループの指定等) を定義するための基本的な設定が含まれている。
*: <br>
* www.conf : PHP-FPMの各プールごとの設定
*: www.confファイルは、プールごとの設定を管理する。
*: 各プールは、異なるWebサイトやアプリケーションのために異なる設定を持つことができる。
*: <br>
*: www.confファイルでは、各プールに対する特定の設定 (プロセス数、ユーザ、グループ、ソケット、ポートの設定等) が指定される。
*: 各プールは異なる設定を持つことができ、これにより異なるWebサイトやアプリケーションをホストする時に、それぞれの要件に合わせて調整できる。
*: <br>
*: 簡単に言えば、php-fpm.confファイルは全体のPHP-FPMの基本的な設定を管理して、www.confファイルは個別のプール (Webサイトやアプリケーションごとに異なる) の設定を管理する。
*: <br>
*: これにより、異なるプールが異なる要件に合わせて調整され、柔軟性が向上する。
<br><br>
<br><br>


== Apache2上でPHP 7の有効化 ==
== Apache2上でPHPの有効化 ==
Apache2上でPHP 7を動作させるため、モジュールを追加する。(httpd.confに直接記述してもよい)<br>
Apache2上でPHPを動作させるため、モジュールを追加する。(httpd.confに直接記述してもよい)<br>
  # モジュールを追加する場合
  # モジュールを追加する場合
  sudo a2enmod php7
  sudo a2enmod php<PHPのバージョン>
例. sudo a2enmod php8
   
   
  # モジュールを削除する場合
  # モジュールを削除する場合
  sudo a2dismod php7
  sudo a2dismod php<PHPのバージョン>
例. sudo a2dismod php8
<br>
<br>
設定を反映させるため、Apache2を再起動する。<br>
設定を反映させるため、Apache2を再起動する。<br>
93行目: 461行目:


== インストール時の注意点 ==
== インストール時の注意点 ==
CentOSでのPHP7のインストールにおいて、旧バージョンのPHPが指定されることを防ぐため、一旦全てのリポジトリを無効化し、PHP7のリポジトリを指定する。<br>
RHELでのPHP7のインストールにおいて、旧バージョンのPHPが指定されることを防ぐため、一旦全てのリポジトリを無効化し、PHP7のリポジトリを指定する。<br>
  sudo yum --disablerepo=* --enablerepo=remi,remi-php73 install php hp-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php73-devel
  sudo dnf --disablerepo=* --enablerepo=remi,remi-php74 install php hp-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php74-devel
<br>
<br>
EPELリポジトリおよびRemiリポジトリの追加方法で、EPELリポジトリの公開鍵を取得するためにlibargon2をインストールしているが、<br>
EPELリポジトリおよびRemiリポジトリの追加方法で、EPELリポジトリの公開鍵を取得するためにlibargon2をインストールしているが、<br>
100行目: 468行目:
もし、libargon2をインストールせずにPHPをインストールしようとすると、恐らくEPELが無いために依存性が解決されない。<br>
もし、libargon2をインストールせずにPHPをインストールしようとすると、恐らくEPELが無いために依存性が解決されない。<br>
PHP7をインストールする前に、以下のコマンドを実行してlibargon2をインストールする。<br>
PHP7をインストールする前に、以下のコマンドを実行してlibargon2をインストールする。<br>
  sudo yum --disablerepo=* --enablerepo=epel install libargon2
  sudo dnf --disablerepo=* --enablerepo=epel install libargon2
<br><br>
 
== php.iniファイルのパス ==
phpコマンドの-i / --iniオプションを付加する。<br>
php -i | grep php.ini または php --ini | grep php.ini
# 出力例
Configuration File (php.ini) Path => /home/user/InstallSoftware/PHP/PHP_8_3/lib
Loaded Configuration File => /home/user/InstallSoftware/PHP/PHP_8_3/lib/php.ini
<br>
phpinfo関数を使用する。<br>
php -r "echo phpinfo();" | grep "php.ini"
# 出力例
Configuration File (php.ini) Path => /home/user/InstallSoftware/PHP/PHP_8_3/lib
Loaded Configuration File => /home/user/InstallSoftware/PHP/PHP_8_3/lib/php.ini
<br>
<br><br>
<br><br>


== 複数のバージョンのPHP-FPM ==
== 複数のバージョンのPHP-FPM ==
PHP-FPMを使用する場合に限り、複数のバージョンのPHPをインストールしてApacheで動作することができる。<br>
PHP-FPMを使用する場合に限り、複数のバージョンのPHPをインストールしてApache2 / Nginxで動作することができる。<br>
<br>
<br>
1つのPHPのバージョンを標準として設定しておき、仮想ホストにおいて他のPHPのバージョンを実行することができる。<br>
あらかじめ、1つのPHPのバージョンを標準として設定しておき、仮想ホストにおいて他のPHPのバージョンを実行することができる。<br>
これは、PHPベースのソフトウェアが特定のバージョンを必要とする場合や最新版のPHPとの互換性が無い場合に必要となる。<br>
これは、PHPベースのソフトウェアが特定のバージョンを必要とする場合や最新版のPHPとの互換性が無い場合に必要となる。<br>
<br>
<br>
==== Apache2の場合 ====
以下の例では、複数のバージョンのPHPを同時に実行している。<br>
以下の例では、複数のバージョンのPHPを同時に実行している。<br>
<br>
<br>
まず、複数のバージョンのPHP-FPMをインストールする。(例えば、PHP 7.2とPHP 7.4)<br>
まず、複数のバージョンのPHP-FPMをインストールする。<br>
以下の例では、PHP 7.2とPHP 7.4としている、<br>
  sudo apt-get install php7.2-fpm php7.4-fpm
  sudo apt-get install php7.2-fpm php7.4-fpm
<br>
<br>
131行目: 518行目:
     </FilesMatch>
     </FilesMatch>
  </VirtualHost>
  </VirtualHost>
<br>
==== NginXの場合 ====
まず、FastCGIプロセスのユーザおよびグループを設定する。<br>
# パッケージ管理システムからPHPをインストールしている場合
# 以下の例では、RHELにおいてPHP 8.3とPHP 7.4をインストールしている
sudo vi /etc/opt/remi/php83/php-fpm.d/www.conf
sudo vi /etc/opt/remi/php74/php-fpm.d/www.conf
# 任意のディレクトリにPHPをインストールしている場合
vi /<PHPのインストールディレクトリ 1>/etc/php-fpm.d/www.conf
vi /<PHPのインストールディレクトリ 2>/etc/php-fpm.d/www.conf
<br>
<syntaxhighlight lang="ini">
user = <NginXが稼働しているユーザ名  例: nginx>
group = <NginXが稼働しているグループ名  例: nginx>
</syntaxhighlight>
<br>
次に、各バージョンのPHP-FPMのプール設定ファイルにおいて、ListenパラメータをFastCGI要求を受信するアドレスとポートを定義する。<br>
# パッケージ管理システムからPHPをインストールしている場合
# 以下の例では、RHELにおいてPHP 8.3とPHP 7.4をインストールしている
sudo vi /etc/opt/remi/php83/php-fpm.d/www.conf
sudo vi /etc/opt/remi/php74/php-fpm.d/www.conf
# 任意のディレクトリにPHPをインストールしている場合
vi /<PHPのインストールディレクトリ 1>/etc/php-fpm.d/www.conf
vi /<PHPのインストールディレクトリ 2>/etc/php-fpm.d/www.conf
<br>
<syntaxhighlight lang="ini">
# www.confファイル (例: PHP-FPM 8.3)
listen = <IPアドレス または ホスト名  例: 127.0.0.1>:<ポート番号  例: 9000>
; または
listen = <PHP-FPMのソケットファイルのフルパス  例: /var/run/php-fpm/php-fpm83.sock> </syntaxhighlight>
<br>
<syntaxhighlight lang="ini">
# www.confファイル (例: PHP-FPM 7.4)
listen = <IPアドレス または ホスト名  例: 127.0.0.1>:<ポート番号  例: 9001>
; または
listen = <PHP-FPMのソケットファイルのフルパス  例: /var/run/php-fpm/php-fpm74.sock> </syntaxhighlight>
<br>
NginXがWebサイトへのリクエスト処理を決定するため、NginXの仮想ホスト向けサーバブロック設定ファイルを編集する。<br>
<syntaxhighlight lang="nginx">
# NginXのサーバブロック設定ファイル (仮想ホスト 1)  例: PHP 8.3向け
server {
    # ...略
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
      root        /srv/www/htdocs/example1.com/;
      fastcgi_pass <IPアドレス または ホスト名 または PHP-FPMのソケットファイルのフルパス>;
                    # 例1: <127.0.0.1>:<ポート番号  例: 9000>
                    # 例2: unix:/<PHPのインストールディレクトリ 1>/var/run/php-fpm/php-fpm.sock;
                    # 例3: unix:/var/run/php-fpm/php-fpm83.sock;
     
      # ...略
    }
    # ...略
}
</syntaxhighlight>
<br>
<syntaxhighlight lang="nginx">
# NginXのサーバブロック設定ファイル (仮想ホスト 2)  例: PHP 7.4向け
server {
    # ...略
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9001
    location ~ \.php$ {
      root        /srv/www/htdocs/example2.com/;
      fastcgi_pass <IPアドレス または ホスト名 または PHP-FPMのソケットファイルのフルパス>;
                    # 例1: <127.0.0.1>:<ポート番号  例: 9001>
                    # 例2: unix:/<PHPのインストールディレクトリ 2>/var/run/php-fpm/php-fpm.sock;
                    # 例3: unix:/var/run/php-fpm/php-fpm74.sock;
      # ...略
    }
    # ...略
}
</syntaxhighlight>
<br>
NginXの設定ファイル群のシンタックスを確認する。<br>
sudo nginx -t
<br>
NginXおよび各PHP-FPM向けのSystemdサービスを起動する。<br>
以下の例は、RHELの場合である。<br>
sudo systemctl start nginx  \
                      php-fpm \      # 例: PHP-FPM 8.3の起動
                      php74-php-fpm  # 例: PHP-FPM 7.4の起動
<br>
ローカルでWebサーバを運用している場合は、/etc/hostsファイルを編集してローカルDNSを設定する。<br>
sudo vi /etc/hosts
<br>
# /etc/hostsファイル
127.0.0.1  <仮想ホスト名 1>  [<エイリアス名 1>]
127.0.0.1  <仮想ホスト名 2>  [<エイリアス名 2>]
<br>
下図のように、Webブラウザから仮想ホスト名またはエイリアス名を入力して、各Webサイトが正常に表示されるかどうかを確認する。<br>
[[ファイル:Install PHP 1.png|フレームなし|中央|800px]]<br>
<br><br>
<br><br>


136行目: 623行目:
Xdebugをインストールする場合は、[[インストール - Xdebug]]のページを参照すること。<br>
Xdebugをインストールする場合は、[[インストール - Xdebug]]のページを参照すること。<br>
<br><br>
<br><br>
== APCu ==
==== APCuとは ====
APCuは、PHP向けのインメモリ・キー / 値ストアである。<br>
キーは文字列型で、値は任意のPHP変数にすることができる。<br>
<br>
APUuはAPCからオペコードキャッシュを取り除いたものであり、<br>
変数のユーザランドキャッシュのみをサポートしている。<br>
<br>
APCuの詳細を知りたい場合は、[https://github.com/krakjoe/apcu-bc APCu Backwards Compatibility Module]を参照すること。<br>
<br>
==== APCuのインストール ====
# RHEL
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf install gcc make pcre-devel php-pear httpd-devel
sudo dnf install php-pecl-apcu
# SUSE
sudo zypper install php8-APCu
<br>
WebサーバまたはPHP-FPMを再起動する。<br>
# Apache 2の場合
sudo systemctl restart httpd
# PHP-FPMの場合
sudo systemctl restart php-fpm
<br>
==== ソースコードからのインストール ====
[https://github.com/krakjoe/apcu APCuのGithub]にアクセスして、ソースコードをダウンロードする。<br>
ダウンロードしたファイルを解凍する。<br>
tar xf apcu-<バージョン>.tar.gz
cd apcu-<バージョン>
<br>
APCuをビルドおよびインストールする。<br>
phpize
mkdir apcu-build && cd apcu-build
../configure --prefix=<PHPのインストールディレクトリ> \
              --enable-apcu
make -j $(nproc)
make install
<br><br>


__FORCETOC__
__FORCETOC__
[[カテゴリ:CentOS]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]]
[[カテゴリ:RHEL]][[カテゴリ:SUSE]][[カテゴリ:Raspberry_Pi]][[カテゴリ:Web]]

2024年12月1日 (日) 00:16時点における最新版

概要

PHPは1995年にRasmus Lerdorfによって開発された主にWebアプリケーション開発のために設計されたプログラミング言語である。
当初は「Personal Home Page」の略称であったが、現在は「PHP: Hypertext Preprocessor」という再帰的な頭字語として知られている。

PHPの最も重要な特徴は、HTMLに直接埋め込むことができることである。

 <html>
   <body>
     <?php
       echo "Hello, World!";
     ?>
   </body>
 </html>


また、PHPはサーバサイドで動作する言語である。
つまり、Webブラウザからリクエストが来る時、サーバ上でPHPコードが実行されてその結果生成されたHTMLがWebブラウザに送信される。
この特性により、データベース操作やファイル処理等、サーバ側での複雑な処理を実現できる。

PHPの強みとして、豊富な標準ライブラリがある。
データベース接続、文字列処理、ファイル操作、画像処理等、Web開発に必要な機能の多くが標準で提供されている。
特にMySQL等のデータベースとの連携が容易であり、多くのWebサイトやアプリケーションの開発に利用されている。

フレームワークの面では、LaravelやSymfonyといった強力なフレームワークが存在しており、より効率的な開発を可能にしている。
これらのフレームワークは、セキュリティ、パフォーマンス、保守性等の面で優れた機能を提供する。

PHPの学習曲線は比較的緩やかで、初心者にも取り組みやすい言語である。
基本的な文法は他の主要なプログラミング言語と似ており、特にC言語やJavaの経験がある方には馴染みやすい。

セキュリティに関しては、最新のPHPバージョンでは多くの改善が行われている。
ただし、開発者自身がセキュリティベストプラクティスを理解して、適切に実装することが重要である。
例えばSQLインジェクションやクロスサイトスクリプティング (XSS) への対策は、必須の知識となる。

PHPは継続的に進化を続けており、現在のPHP 8系では、JITコンパイラの導入や型システムの強化等、パフォーマンスと開発体験の向上が図られている。
これにより、より堅牢で高速なアプリケーション開発が可能になっている。


PHPのインストール (パッケージ管理システムからインストールする場合)

RHEL

もし、PHP 5がインストールされている場合は、PHP 5アンインストールする。

この時、php.iniファイルを変更している場合はバックアップを取得する。
これは、新しいPHPをインストールした時点でphp.iniファイルが上書きされるためである。

sudo dnf remove php-*


次に、設定 - EPELリポジトリとRemiリポジトリを参照して、EPELリポジトリとRemiリポジトリを追加する。

--enablerepoオプションを付加して、PHPをインストールする。
アップデート後は、php.iniファイルが上書きされているのでバックアップから復元する。

sudo dnf --enablerepo=remi-php73 install php php-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php73-devel


SUSE

PHP 7をインストールする場合 (パッケージ管理システムのみ)

PHPおよび主要なPHPモジュールをインストールする。

sudo zypper install php7 php apache2-mod_php7 php7-curl php7-xmlreader php7-zip php7-pdo php7-gd php7-json php7-mysql php7-mbstring \
                    php7-openssl php7-pecl php7-devel php7-fpm php7-fileinfo php7-phar


PHP 8をインストールする場合


SUSEのデフォルトのPHP-FPMは、--with-fpm-user=wwwrunオプションと--with-fpm-group=wwwオプションを付加してコンパイルされている。
ユーザ名がwwwrun、グループ名がwwwとなっている。

Raspberry Pi

まず、lsb-releaseをインストールする。

sudo apt-get install lsb-release


packages.sury.orgからPHPのGPGキーを登録するため、以下のコマンドを実行する。

wget -q https://packages.sury.org/php/apt.gpg -O- | sudo apt-key add -


リポジトリを追加するファイルを作成して、そのファイルにpackages.sury.orgのPHPリポジトリの情報を追加する。

echo "deb https://packages.sury.org/php/ `lsb_release -cs` main" | sudo tee /etc/apt/sources.list.d/php.list


パッケージリストの更新を行う。

sudo apt-get update


外部リポジトリからインストール可能なPHPパッケージの情報を確認するため、以下のコマンドを実行する。

sudo apt-cache policy php


PHP 7および主要なPHPモジュールをインストールするため、以下のコマンドを実行する。

# PHP 7.3
sudo apt-get install php7.3 php7.3-fpm php7.3-mysql php7.3-mbstring php7.3-gd php7.3-zip php7.3-xml php7.3-common php7.3-curl php7.3-intl php-acpu

# PHP 7.4
sudo apt-get install php7.4 php7.4-cli php7.4-mysql php7.4-mbstring php7.4-gd php7.4-zip php7.4-xml php7.4-common php7.4-curl php7.4-intl



PHPのインストール (ソースコードからインストールする場合)

c-clientライブラリのインストール (非推奨)

c-clientライブラリのビルドに必要なライブラリをインストールする。

# RHEL
sudo dnf install make gcc openssl-devel pam-devel krb5-devel libksba-devel

# SUSE
sudo zypper install make gcc openssl-devel pam-devel krb5-devel libksba-devel


c-clientライブラリのソースコードをダウンロードする。

git clone https://github.com/uw-imap/imap
cd imap


c-clientライブラリをビルドおよびインストールする。

# OpenSSLをサポートする場合、かつ、PAMモジュールを使用する場合
make -j $(nproc) lnp SSLTYPE=unix
make install

# OpenSSLをサポートしない場合、かつ、PAMモジュールを使用する場合
make -j $(nproc) lnp
make install

# OpenSSLをサポートしない場合、かつ、PAMモジュールを使用しない場合
make -j $(nproc)
make install


c-clientライブラリのシンボリックリンクを作成する。

ln -s /<IMAPのインストールディレクトリ>/lib/c-client.a \
      /<IMAPのインストールディレクトリ>/lib/libc-client.a


~/.profileファイル等に、c-clientライブラリのパスを設定する。

vi ~/.profile


 # ~/.profileファイル
 
 export LD_LIBRARY_PATH="/<c-clientライブラリのインストールディレクトリ>/lib:$LD_LIBRARY_PATH"
 
 export PKG_CONFIG_PATH="$(pkg-config --variable pc_path pkg-config)"
 export PKG_CONFIG_PATH="/<c-clientライブラリのインストールディレクトリ>/lib/pkgconfig:${PKG_CONFIG_PATH}"


PHPのインストール

RHELやSUSEの標準リポジトリにあるPHPのバージョンは古いことが多い。
また、PHP 7以降は大幅な改良がされており、実行速度をはじめ様々なものがアップデートされているので、特別な事情がない限りはアップグレードした方がよい。

Raspberry Piにおいて、ここでは、外部リポジトリとしてpackages.sury.org/phpを使用しているが、
このリポジトリを使用しても、常に最新版のPHPになる訳ではないことに注意すること。

また、複数のPHPのバージョンをインストールする場合、ソースコードからインストールする方が融通が利く。

PHPのビルドに必要なライブラリをインストールする。

sudo zypper install make gcc gcc-c++ ccache re2c gmp-devel pcre-devel pcre2-devel zlib-devel libzip-devel \
                    readline-devel libcurl-devel gd-devel libxml2-devel freetype2-devel enchant-devel     \
                    libjpeg62-devel libpng16-devel libwebp-devel libavif-devel libffi-devel               \
                    libXpm-devel libXft-devel libxslt-devel oniguruma-devel libsodium-devel libtidy-devel \
                    krb5-server krb5-devel imap imap-devel cyrus-sasl-devel         \
                    libedit-devel libcapstone-devel libxslt-devel argon2-devel icu libicu-devel           \
                    systemd-devel        \
                    libopenssl-1_1-devel \  # OpenSSL 1 を使用する場合
                    libopenssl-3-devel   \  # OpenSSL 3 を使用する場合
                    sqlite3-devel        \
                    unixODBC-devel       \
                    libmariadb-devel     \
                    libmysqld-devel      \
                    lmdb-devel           \  # BtreeベースのDBMSを使用する場合
                    postgresql17-devel      # PHP 8.4以降 : PostgreSQLを使用する場合
                    postgresql-devel        # PHP 8.4以前 : PostgreSQLを使用する場合
                    valgrind-devel          # Valgrind (メモリリーク検知機能) を有効にする場合
                    aspell-devel            # GNU ASpellを使用する場合
                    libc-client2007e_suse   # SUSE 15.5以前 (SUSE 15.6以降では、このパッケージは無くなっているため)


PHPの公式Webサイトにアクセスして、PHPのソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf php-<バージョン>.tar.xz
cd php-<バージョン>


ビルド用ディレクトリを作成する。

mkdir phpbuild && cd phpbuild


PHPをビルドおよびインストールする。
PHPのインストール後は、/Apache2のインストールディレクトリ>/modulesディレクトリにlibphp.soファイルもインストールされる。

../configure --prefix=<PHPのインストールディレクトリ> \
             --enable-bcmath --enable-calendar --enable-cgi --enable-cli --enable-exif --enable-ftp --enable-fpm     \
             --enable-gd --enable-gd-jis-conv --enable-inifile --enable-intl --enable-mbregex --enable-mbstring      \
             --enable-mysqlnd --enable-opcache --enable-phpdbg --enable-phpdbg-debug --enable-sockets --with-enchant \
             --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-shmop --enable-soap --enable-zts            \
             --with-curl --with-expat -with-freetype --with-gettext --with-gmp --with-iconv --with-jpeg --with-avif --with-ffi \
             --with-openssl --with-mhash \
             --with-readline --with-sodium --with-tidy --with-xpm                    \
             --with-zlib --with-zip --with-libxml --with-xsl --with-ldap --with-pic  \
             --with-fpm-systemd        \
             --with-unixODBC=shared    \
             --with-mysql-sock         \
             --with-mysqli=mysqlnd     \  # MySQL拡張モジュールであるmysqliMySQL Native Driverでビルドする
             --with-pdo-mysql=mysqlnd  \  # MySQL拡張モジュールであるPDO MYSQLをMySQL Native Driverでビルドする
             --with-pgsql              \  # PostgresSQLを使用する場合
             --with-pdo-pgsql          \  # PostgresSQLを使用する場合
             --with-lmdb               \  # BtreeベースのDBMSを使用する場合
             --with-pear               \
             --with-pspell             \  # GNU ASpellを有効にする場合
             --with-valgrind           \  # Valgrind (メモリリーク検知機能) を有効にする場合
             --with-imap-ssl           \  # PHP 8.4以降は不要
             --with-kerberos           \  # PHP 8.4以降は不要
             --with-imap               \  # SUSE 15.5以前 (IMAPライブラリを使用する場合)
             --without-imap            \  # PHP 8.4以降は不要
                                          # Composer経由で利用できるメールライブラリが多数存在するため、システムのIMAPライブラリは不要
             --with-mcrypt             \  # PHP 7.2以降は削除されたため不要
             --with-libdir=lib64                               \
             --with-apxs2=/<Apacheのインストールディレクトリ>/bin/apxs \
             --with-config-file-path=<php.iniファイルの配置するディレクトリのパス  例: /home/user/PHP/lib> \  # ユーザが指定する場合
             --with-fpm-user=<PHP-FPMを実行するユーザ名>           \  # オプション
             --with-fpm-group=<PHP-FPMを実行するグループ名>           # オプション

make -j $(nproc)
make install


PHPの実行に必要なライブラリをインストールする。

# SUSE
sudo zypper install libonig4 
                    libpq5                 # PostgresSQLを使用する場合
                    libaspell15            # GNU ASpellを使用する場合
                    libc-client2007e_suse  # SUSE 15.5以前


~/.profileファイル等に、環境変数PATHを追記する。

vi ~/.profile


 # ~/.profileファイル
 
 export PATH="/<PHPのインストールディレクトリ>/bin:/<PHPのインストールディレクトリ>/sbin:$PATH"


Apache2を使用する場合

Apache2を使用する場合、Apache2の設定ファイルであるhttpd.confファイルを編集して、phpファイルを実行できるように設定する。

vi /<Apacheの設定ファイルがあるディレクトリ>/conf/httpd.conf


 # /<Apacheの設定ファイルがあるディレクトリ>/conf/httpd.confファイル
 
 LoadModule php_module modules/libphp.so
 
 <FilesMatch "\.php$">
    SetHandler application/x-httpd-php
 </FilesMatch>
 
 <IfModule php_module>
    DirectoryIndex index.html default.php index.php
    AddHandler application/x-httpd-php .php
 </IfModule>


PHPの設定

次に、PHPの設定ファイルであるphp.iniファイルを設定する。
php.iniファイルのデフォルトのパスは、/<PHPのインストールディレクトリ>/lib64ディレクトリである。

なお、php --iniコマンドを実行することにより、php.iniファイルを配置するパスが表示される。

configureスクリプト実行時に--with-config-file-path=オプションを指定することにより、php.iniファイルを配置するパスを変更することができる。

php.iniファイルは、ダウンロードしたPHPのソースコードのトップディレクトリに存在するため、これをコピーする。

cp /<PHPのソースコードがあるディレクトリ>/php.ini-development /<PHPのインストールディレクトリ>/lib64


PHP-FPMの全体の設定

PHP-FPMを使用する場合、ソケットファイルが配置されるディレクトリを作成する。

mkdir -p /<PHPのインストールディレクトリ>/var/run/php-fpm


これは、configureスクリプトの実行時に、--enable-fpmオプションを指定した場合、PHP-FPMライブラリがインストールされる。
まず、php-fpm.confファイルを作成する。

cd <PHPのインストールディレクトリ>/etc
cp php-fpm.conf.default php-fpm.conf


php-fpm.confでは、プロセスファイルやログのパス等を変更することができる。

vi php-fpm.conf


 # php-fpm.confファイル
 
 ; ...略
 
 pid = <PHP-FPMのPIDファイルのパス 例. /var/run/php-fpm/php-fpm.pid>
 error_log = <PHP-FPMのエラーログファイルのパス  例. /var/log/php-fpm/php-fpm.log>
 
 ; ...略


PHP-FPMのプール設定

Webアプリケーションを使用する場合、PHP-FPMのプール設定ファイルであるwww.confファイルを作成する。
PHP-FPMを実行するには、使用するユーザアカウントを設定する必要がある。

適切なアカウントを使用しない場合は、パーミッションエラーが発生する可能性がある。

また、使用するアカウントは、OSやWebサーバによって異なる。

例えば、NginXの場合、デフォルトの設定ではnginxという名前のアカウントを使用する。 (ソースコードからインストールしている場合、オプションを付加して変更することができる)
Apache2の場合、SUSEではwwwrun、Ubuntu / Debianではwww-data、RHELではnobodyを使用する。

以下の設定例は、NginXを使用したサーバの設定である。

cd /<PHPのインストールディレクトリ>/etc/php-fpm.d
cp www.conf.default www.conf


vi www.conf


ここでは、以下の設定を変更している。

 # www.confファイル
 
 ; ...略
 
 user = <ユーザ名  例. nginx>
 group = <グループ名  例. nginx>
 
 ; Unixドメインソケット (例: unix:/var/run/php-fpm/php-fpm.sock) を使用している場合は、
 ; listen.owner、listen.group、listen.modeも設定する
 listen.owner = <ユーザ名  例. nginx>
 listen.group = <グループ名  例. nginx>
 listen.mode  = 0660
 
 ; 通信方法の設定
 ; nginx.confファイルにおいても、同様の設定を行う必要がある (NginXの設定は、インストール - NginXのページを参照すること)
 listen = <TCPまたはUnixドメインソケット>
          ;例1. TCPを使用する場合 : 127.0.0.1:9000
          ;例2. Unixドメインソケットを使用する場合 : /var/run/php-fpm/php-fpm.sock
 
 ; PHP-FPMがパース可能なメインスクリプトを拡張子で制限する(サーバ側の設定ミスによる被害を抑えることができる)
 ; PHP-FPMには、.php拡張子のみをパースできるようにする場合、悪意のあるユーザがその他の拡張子でphpのコードを実行しようとする試みを防ぐことができる
 ; デフォルト値 : .php .phar
 security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8 .html
 
 ; PHP-FPM実行時のエラーログ
 php_admin_value[error_log] = <PHP-FPMのプール設定向けログファイルのパス  例: /var/log/php-fpm/www.log>
 php_admin_flag[log_errors] = on
 php_admin_value[memory_limit] = 32M
 php_flag[display_errors] = on
 
 ; ...略


必要ならば、PHP-FPMのアクセスファイルやログファイルを配置するディレクトリパスを変更または作成する。
なお、デフォルトの設定では、ログディレクトリのパスはPHPのインストールディレクトリ下にあるvar/log/php-fpm.logである。

sudo mkdir /var/log/php-fpm
sudo chown <上記で設定したユーザ名>:<上記で設定したグループ名> /var/log/php-fpm

sudo mkdir /var/run/php-fpm
sudo chown -R <上記で設定したユーザ名>:<上記で設定したグループ名> /var/run/php-fpm


PHP-FPMのSystemdサービスユニットの作成

PHP-FPMを使用する場合は、/etc/systemcd/systemディレクトリにSystemdサービスユニットを作成する。

sudo vi /etc/systemcd/system/php-fpm.service


 # /etc/systemcd/system/php-fpm.serviceファイル
 
 # It's not recommended to modify this file in-place, because it will be overwritten during upgrades.
 # If you want to customize, the best way is to use the "systemctl edit" command.
 
 [Unit]
 Description=The PHP FastCGI Process Manager
 After=network.target
 Before=apache2.service nginx.service lighttpd.service
 
 [Service]
 Type=simple
 ExecStart=/<PHPのインストールディレクトリ>/sbin/php-fpm --nodaemonize --fpm-config /<PHPのインストールディレクトリ>/etc/php-fpm.conf
 ExecReload=/bin/kill -USR2 $MAINPID
 
 # Set up a new file system namespace and mounts private /tmp and /var/tmp directories,
 # so this service cannot access the global directories and other processes cannot access this service's directories.
 PrivateTmp=true
 
 # Mounts the /usr, /boot, and /etc directories read-only for processes invoked by this unit.
 ProtectSystem=full
 
 # Sets up a new /dev namespace for the executed processes and only adds API pseudo devices
 # such as /dev/null, /dev/zero or /dev/random (as well as the pseudo TTY subsystem) to it, but no physical devices such as /dev/sda.
 PrivateDevices=true
 
 # Explicit module loading will be denied. This allows to turn off module load and unload operations on modular kernels.
 # It is recommended to turn this on for most services that do not need special file systems or extra kernel modules to work.
 ProtectKernelModules=true
 
 # Kernel variables accessible through /proc/sys, /sys, /proc/sysrq-trigger, /proc/latency_stats,
 # /proc/acpi, /proc/timer_stats, /proc/fs and /proc/irq will be made read-only to all processes of the unit.
 # Usually, tunable kernel variables should only be written at boot-time, with the sysctl.d(5) mechanism.
 # Almost no services need to write to these at runtime; it is hence recommended to turn this on for most services.
 ProtectKernelTunables=true
 
 # The Linux Control Groups (cgroups(7)) hierarchies accessible through /sys/fs/cgroup will be made read-only to all processes of the unit.
 # Except for container managers no services should require write access to the control groups hierarchies;
 # it is hence recommended to turn this on for most services
 ProtectControlGroups=true
 
 # Any attempts to enable realtime scheduling in a process of the unit are refused.
 RestrictRealtime=true
 
 # Restricts the set of socket address families accessible to the processes of this unit.
 # Protects against vulnerabilities such as CVE-2016-8655
 RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
 
 # Takes away the ability to create or manage any kind of namespace
 RestrictNamespaces=true
 
 [Install]
 WantedBy=multi-user.target



PHP-FPMの設定ファイルとは

PHP-FPM (FastCGI Process Manager) は、PHPのFastCGI実装であり、WebサーバとPHPプロセスの間で通信を行う。
PHP-FPMの設定は、主に2つのファイルで管理される。

  • php-fpm.conf : PHP-FPMの全体的な設定
    php-fpm.confファイルは、PHP-FPM全体の設定を管理する。

    例えば、プロセスの挙動、ログの場所、マスタープロセスの設定等が含まれる。
    php-fpm.confファイルは、PHP-FPMのコアの設定を定義するため、複数のプール (ポート番号、ユーザ、グループの指定等) を定義するための基本的な設定が含まれている。

  • www.conf : PHP-FPMの各プールごとの設定
    www.confファイルは、プールごとの設定を管理する。
    各プールは、異なるWebサイトやアプリケーションのために異なる設定を持つことができる。

    www.confファイルでは、各プールに対する特定の設定 (プロセス数、ユーザ、グループ、ソケット、ポートの設定等) が指定される。
    各プールは異なる設定を持つことができ、これにより異なるWebサイトやアプリケーションをホストする時に、それぞれの要件に合わせて調整できる。

    簡単に言えば、php-fpm.confファイルは全体のPHP-FPMの基本的な設定を管理して、www.confファイルは個別のプール (Webサイトやアプリケーションごとに異なる) の設定を管理する。

    これにより、異なるプールが異なる要件に合わせて調整され、柔軟性が向上する。



Apache2上でPHPの有効化

Apache2上でPHPを動作させるため、モジュールを追加する。(httpd.confに直接記述してもよい)

# モジュールを追加する場合
sudo a2enmod php<PHPのバージョン>
例. sudo a2enmod php8

# モジュールを削除する場合
sudo a2dismod php<PHPのバージョン>
例. sudo a2dismod php8


設定を反映させるため、Apache2を再起動する。

sudo systemctl restart apache2



確認方法

最後に、インストールされたPHPのバージョンを確認するため、以下のコマンドを実行する。

php -v


運用していく上で必要な関連パッケージがあれば、適宜追加する。


インストール時の注意点

RHELでのPHP7のインストールにおいて、旧バージョンのPHPが指定されることを防ぐため、一旦全てのリポジトリを無効化し、PHP7のリポジトリを指定する。

sudo dnf --disablerepo=* --enablerepo=remi,remi-php74 install php hp-cli.x86_64 php-pdo.x86_64 php-gd.x86_64 php-mbstring.x86_64 php-common.x86_64 php-mysql php74-devel


EPELリポジトリおよびRemiリポジトリの追加方法で、EPELリポジトリの公開鍵を取得するためにlibargon2をインストールしているが、
このパッケージは、PHP7をインストールする際に依存性パッケージとして必要になる。
もし、libargon2をインストールせずにPHPをインストールしようとすると、恐らくEPELが無いために依存性が解決されない。
PHP7をインストールする前に、以下のコマンドを実行してlibargon2をインストールする。

sudo dnf --disablerepo=* --enablerepo=epel install libargon2



php.iniファイルのパス

phpコマンドの-i / --iniオプションを付加する。

php -i | grep php.ini または php --ini | grep php.ini

# 出力例
Configuration File (php.ini) Path => /home/user/InstallSoftware/PHP/PHP_8_3/lib
Loaded Configuration File => /home/user/InstallSoftware/PHP/PHP_8_3/lib/php.ini


phpinfo関数を使用する。

php -r "echo phpinfo();" | grep "php.ini"

# 出力例
Configuration File (php.ini) Path => /home/user/InstallSoftware/PHP/PHP_8_3/lib
Loaded Configuration File => /home/user/InstallSoftware/PHP/PHP_8_3/lib/php.ini




複数のバージョンのPHP-FPM

PHP-FPMを使用する場合に限り、複数のバージョンのPHPをインストールしてApache2 / Nginxで動作することができる。

あらかじめ、1つのPHPのバージョンを標準として設定しておき、仮想ホストにおいて他のPHPのバージョンを実行することができる。
これは、PHPベースのソフトウェアが特定のバージョンを必要とする場合や最新版のPHPとの互換性が無い場合に必要となる。

Apache2の場合

以下の例では、複数のバージョンのPHPを同時に実行している。

まず、複数のバージョンのPHP-FPMをインストールする。
以下の例では、PHP 7.2とPHP 7.4としている、

sudo apt-get install php7.2-fpm php7.4-fpm


次に、2つのポートで動作する2つの仮想ホストを作成する。
Apacheの設定ファイル(/etc/apache2/ports.conf)を、以下のように編集する。("Listen 80"の後に以下の行を追記する)

Listen 8080
Listen 8081


/etc/apache2/sites-available/000-default.confファイルの仮想ホストの設定を編集する。(2つの仮想ホストの設定を追記する)

<VirtualHost *:8080>
   <FilesMatch ".+\.ph(ar|p|tml)$">
      SetHandler "proxy:unix:/run/php/php7.2-fpm.sock|fcgi://localhost"
   </FilesMatch>
</VirtualHost>

<VirtualHost *:8081>
   <FilesMatch ".+\.ph(ar|p|tml)$">
      SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost"
   </FilesMatch>
</VirtualHost>


NginXの場合

まず、FastCGIプロセスのユーザおよびグループを設定する。

# パッケージ管理システムからPHPをインストールしている場合
# 以下の例では、RHELにおいてPHP 8.3とPHP 7.4をインストールしている
sudo vi /etc/opt/remi/php83/php-fpm.d/www.conf
sudo vi /etc/opt/remi/php74/php-fpm.d/www.conf

# 任意のディレクトリにPHPをインストールしている場合
vi /<PHPのインストールディレクトリ 1>/etc/php-fpm.d/www.conf
vi /<PHPのインストールディレクトリ 2>/etc/php-fpm.d/www.conf


 user = <NginXが稼働しているユーザ名  例: nginx>
 group = <NginXが稼働しているグループ名  例: nginx>


次に、各バージョンのPHP-FPMのプール設定ファイルにおいて、ListenパラメータをFastCGI要求を受信するアドレスとポートを定義する。

# パッケージ管理システムからPHPをインストールしている場合
# 以下の例では、RHELにおいてPHP 8.3とPHP 7.4をインストールしている
sudo vi /etc/opt/remi/php83/php-fpm.d/www.conf
sudo vi /etc/opt/remi/php74/php-fpm.d/www.conf

# 任意のディレクトリにPHPをインストールしている場合
vi /<PHPのインストールディレクトリ 1>/etc/php-fpm.d/www.conf
vi /<PHPのインストールディレクトリ 2>/etc/php-fpm.d/www.conf


 # www.confファイル (例: PHP-FPM 8.3)
 listen = <IPアドレス または ホスト名  例: 127.0.0.1>:<ポート番号  例: 9000>
 ; または
 listen = <PHP-FPMのソケットファイルのフルパス  例: /var/run/php-fpm/php-fpm83.sock>


 # www.confファイル (例: PHP-FPM 7.4)
 listen = <IPアドレス または ホスト名  例: 127.0.0.1>:<ポート番号  例: 9001>
 ; または
 listen = <PHP-FPMのソケットファイルのフルパス  例: /var/run/php-fpm/php-fpm74.sock>


NginXがWebサイトへのリクエスト処理を決定するため、NginXの仮想ホスト向けサーバブロック設定ファイルを編集する。

 # NginXのサーバブロック設定ファイル (仮想ホスト 1)  例: PHP 8.3向け
 
 server {
    # ...略
 
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
    location ~ \.php$ {
       root         /srv/www/htdocs/example1.com/;
       fastcgi_pass <IPアドレス または ホスト名 または PHP-FPMのソケットファイルのフルパス>;
                    # 例1: <127.0.0.1>:<ポート番号  例: 9000>
                    # 例2: unix:/<PHPのインストールディレクトリ 1>/var/run/php-fpm/php-fpm.sock;
                    # 例3: unix:/var/run/php-fpm/php-fpm83.sock;
       
       # ...略
    }
 
    # ...略
 }


 # NginXのサーバブロック設定ファイル (仮想ホスト 2)  例: PHP 7.4向け
 
 server {
    # ...略
 
    # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9001
    location ~ \.php$ {
       root         /srv/www/htdocs/example2.com/;
       fastcgi_pass <IPアドレス または ホスト名 または PHP-FPMのソケットファイルのフルパス>;
                    # 例1: <127.0.0.1>:<ポート番号  例: 9001>
                    # 例2: unix:/<PHPのインストールディレクトリ 2>/var/run/php-fpm/php-fpm.sock;
                    # 例3: unix:/var/run/php-fpm/php-fpm74.sock;
       # ...略
    }
 
    # ...略
 }


NginXの設定ファイル群のシンタックスを確認する。

sudo nginx -t 


NginXおよび各PHP-FPM向けのSystemdサービスを起動する。
以下の例は、RHELの場合である。

sudo systemctl start nginx   \
                     php-fpm \      # 例: PHP-FPM 8.3の起動
                     php74-php-fpm  # 例: PHP-FPM 7.4の起動


ローカルでWebサーバを運用している場合は、/etc/hostsファイルを編集してローカルDNSを設定する。

sudo vi /etc/hosts


# /etc/hostsファイル

127.0.0.1   <仮想ホスト名 1>   [<エイリアス名 1>]
127.0.0.1   <仮想ホスト名 2>   [<エイリアス名 2>]


下図のように、Webブラウザから仮想ホスト名またはエイリアス名を入力して、各Webサイトが正常に表示されるかどうかを確認する。

Install PHP 1.png




Xdebugのインストール

Xdebugをインストールする場合は、インストール - Xdebugのページを参照すること。


APCu

APCuとは

APCuは、PHP向けのインメモリ・キー / 値ストアである。
キーは文字列型で、値は任意のPHP変数にすることができる。

APUuはAPCからオペコードキャッシュを取り除いたものであり、
変数のユーザランドキャッシュのみをサポートしている。

APCuの詳細を知りたい場合は、APCu Backwards Compatibility Moduleを参照すること。

APCuのインストール

# RHEL
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
sudo dnf install gcc make pcre-devel php-pear httpd-devel
sudo dnf install php-pecl-apcu

# SUSE
sudo zypper install php8-APCu


WebサーバまたはPHP-FPMを再起動する。

# Apache 2の場合
sudo systemctl restart httpd

# PHP-FPMの場合
sudo systemctl restart php-fpm


ソースコードからのインストール

APCuのGithubにアクセスして、ソースコードをダウンロードする。
ダウンロードしたファイルを解凍する。

tar xf apcu-<バージョン>.tar.gz
cd apcu-<バージョン>


APCuをビルドおよびインストールする。

phpize

mkdir apcu-build && cd apcu-build

../configure --prefix=<PHPのインストールディレクトリ> \
             --enable-apcu 
make -j $(nproc)
make install