「インストール - PHP」の版間の差分
(同じ利用者による、間の74版が非表示) | |||
1行目: | 1行目: | ||
== 概要 == | == 概要 == | ||
PHPは1995年にRasmus Lerdorfによって開発された主にWebアプリケーション開発のために設計されたプログラミング言語である。<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> | ||
PHPは継続的に進化を続けており、現在のPHP 8系では、JITコンパイラの導入や型システムの強化等、パフォーマンスと開発体験の向上が図られている。<br> | |||
これにより、より堅牢で高速なアプリケーション開発が可能になっている。<br> | |||
<br><br> | <br><br> | ||
== | == PHPのインストール (パッケージ管理システムからインストールする場合) == | ||
==== | ==== RHEL ==== | ||
もし、PHP 5がインストールされている場合は、PHP 5アンインストールする。<br> | |||
<br> | |||
この時、php.iniファイルを変更している場合はバックアップを取得する。<br> | |||
これは、新しいPHPをインストールした時点でphp.iniファイルが上書きされるためである。<br> | |||
sudo dnf remove php-* | |||
<br> | <br> | ||
次に、[[設定 - EPELリポジトリとRemiリポジトリ]]を参照して、EPELリポジトリとRemiリポジトリを追加する。<br> | |||
<br> | |||
<code>--enablerepo</code>オプションを付加して、PHPをインストールする。<br> | |||
sudo | アップデート後は、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 | |||
<br> | |||
==== SUSE ==== | |||
===== PHP 7をインストールする場合 (パッケージ管理システムのみ) ===== | |||
PHPおよび主要なPHPモジュールをインストールする。<br> | |||
sudo zypper | 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> | ||
===== PHP 8をインストールする場合 ===== | |||
* パッケージ管理システムからインストール | |||
*: <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> | ||
SUSEのデフォルトのPHP-FPMは、<code>--with-fpm-user=wwwrun</code>オプションと<code>--with-fpm-group=www</code>オプションを付加してコンパイルされている。<br> | |||
ユーザ名がwwwrun、グループ名がwwwとなっている。<br> | |||
<br> | <br> | ||
==== 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 | == PHPのインストール (ソースコードからインストールする場合) == | ||
===== | ==== c-clientライブラリのインストール (非推奨) ==== | ||
PHP | c-clientライブラリのビルドに必要なライブラリをインストールする。<br> | ||
# 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 | |||
<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> | ||
ここでは、以下の設定を変更している。<br> | |||
<syntaxhighlight lang="ini"> | |||
# 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 | |||
; ...略 | |||
</syntaxhighlight> | |||
<br> | <br> | ||
必要ならば、PHP-FPMのアクセスファイルやログファイルを配置するディレクトリパスを変更または作成する。<br> | |||
なお、<u>デフォルトの設定では、ログディレクトリのパスはPHPのインストールディレクトリ下にあるvar/log/php-fpm.logである。</u><br> | |||
sudo | 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> | ||
==== | ==== PHP-FPMのSystemdサービスユニットの作成 ==== | ||
PHP | PHP-FPMを使用する場合は、/etc/systemcd/systemディレクトリにSystemdサービスユニットを作成する。<br> | ||
# PHP | sudo vi /etc/systemcd/system/php-fpm.service | ||
<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 | |||
[Install] | |||
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の有効化 == | ||
Apache2上でPHPを動作させるため、モジュールを追加する。(httpd.confに直接記述してもよい)<br> | |||
# モジュールを追加する場合 | # モジュールを追加する場合 | ||
sudo a2enmod | sudo a2enmod php<PHPのバージョン> | ||
例. sudo a2enmod php8 | |||
# モジュールを削除する場合 | # モジュールを削除する場合 | ||
sudo a2dismod | sudo a2dismod php<PHPのバージョン> | ||
例. sudo a2dismod php8 | |||
<br> | <br> | ||
設定を反映させるため、Apache2を再起動する。<br> | 設定を反映させるため、Apache2を再起動する。<br> | ||
93行目: | 461行目: | ||
== インストール時の注意点 == | == インストール時の注意点 == | ||
RHELでのPHP7のインストールにおいて、旧バージョンのPHPが指定されることを防ぐため、一旦全てのリポジトリを無効化し、PHP7のリポジトリを指定する。<br> | |||
sudo | 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 | 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- | PHP-FPMを使用する場合に限り、複数のバージョンのPHPをインストールしてApache2 / Nginxで動作することができる。<br> | ||
<br> | <br> | ||
あらかじめ、1つのPHPのバージョンを標準として設定しておき、仮想ホストにおいて他のPHPのバージョンを実行することができる。<br> | |||
これは、PHPベースのソフトウェアが特定のバージョンを必要とする場合や最新版のPHPとの互換性が無い場合に必要となる。<br> | これは、PHPベースのソフトウェアが特定のバージョンを必要とする場合や最新版のPHPとの互換性が無い場合に必要となる。<br> | ||
<br> | <br> | ||
==== Apache2の場合 ==== | |||
以下の例では、複数のバージョンのPHPを同時に実行している。<br> | 以下の例では、複数のバージョンのPHPを同時に実行している。<br> | ||
<br> | <br> | ||
まず、複数のバージョンのPHP-FPMをインストールする。 | まず、複数のバージョンの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__ | ||
[[カテゴリ: | [[カテゴリ: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をインストールする場合
- パッケージ管理システムからインストール
sudo zypper install php8 php8-devel php8-curl php8-zip php8-mbstring php8-fileinfo php8-gd \
php8-mysql php8-fpm apache2-mod_php8
- リポジトリを追加してインストール
- まず、Develリポジトリを追加する。
- SLE 15 SP5 :
sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP6/ PHP
- SLE 15 SP5 :
sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP5/ PHP
- SLE 15 SP4 :
sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP4/ PHP
- SLE 15 SP3 :
sudo zypper ar http://download.opensuse.org/repositories/devel:/languages:/php/SLE_15_SP3/ PHP
- Develリポジトリの優先度を高く設定する。
sudo zypper mr -p 90 PHP
- リポジトリを更新する。
- Develリポジトリを初めて使用する場合、GPGキーを受け入れるように求められる。
sudo zypper refresh
- PHP 8をインストールする。
sudo zypper install php8 apache2-mod_php8 php8-curl php8-xmlreader php8-zip php8-pdo php8-gd php8-json php8-mysql php8-mbstring \
php8-openssl php8-devel php8-fpm php8-fileinfo php8-phar
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サイトが正常に表示されるかどうかを確認する。
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