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

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動
90行目: 90行目:
               --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-shmop --enable-soap --enable-zts \
               --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-shmop --enable-soap --enable-zts \
               --with-apxs2=<Apacheのインストールディレクトリ>/bin/apxs \
               --with-apxs2=<Apacheのインストールディレクトリ>/bin/apxs \
               --with-curl --with-expat -with-freetype --with-gettext --with-gmp --with-iconv --with-imap --with-imap-ssl --with-kerberos --with-libxml \
               --with-curl --with-expat -with-freetype --with-gettext --with-gmp --with-iconv --with-imap --with-imap-ssl --with-jpeg --with-kerberos \
               --with-openssl --with-pic --with-readline --with-sodium --with-xpm --with-zip --with-zlib --with-unixODBC=shared \
               --with-libxml --with-openssl --with-pic --with-readline --with-sodium --with-xpm --with-zip --with-zlib --with-unixODBC=shared \
               --with-mysql-sock \
               --with-mysql-sock \
               --with-mysqli=mysqlnd    \  # MySQL拡張モジュールであるmysqliMySQL Native Driverでビルドする
               --with-mysqli=mysqlnd    \  # MySQL拡張モジュールであるmysqliMySQL Native Driverでビルドする
152行目: 152行目:
<br>
<br>
Webアプリケーションを使用する場合、PHP-FPMのwww.confファイルを作成する。
Webアプリケーションを使用する場合、PHP-FPMのwww.confファイルを作成する。
PHP-FPMを実行するには、使用するユーザアカウントを設定する必要がある。適切なアカウントを使用しないと、パーミッションエラーが発生する可能性がある。<br>
<br>
使用するアカウントは、OSやWebサーバによって異なる。<br>
例えば、NginXの場合、<u>nginx</u>というアカウントを使用する。<br>
Apache2の場合、SUSEでは<u>wwwrun</u>、Ubuntu / Debianでは<u>www-data</u>、CentOSでは<u>nobody</u>を使用する。<br>
<br>
以下の設定例は、NginXが動作するサーバでの設定である。<br>
  cd /<PHPのインストールディレクトリ>/etc/php-fpm.d
  cd /<PHPのインストールディレクトリ>/etc/php-fpm.d
  cp www.conf.default www.conf
  cp www.conf.default www.conf
162行目: 169行目:
  # ...略
  # ...略
   
   
  user = <ユーザ名>
  user = <ユーザ名 例. nginx>
  group = <グループ名>
group = <グループ名  例. nginx>
listen.owner = <ユーザ名  例. nginx>
  listen.group = <グループ名 例. nginx>
  listen = /var/run/php-fpm/php-fpm.sock
  listen = /var/run/php-fpm/php-fpm.sock
  security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8 .html
  security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8 .html
193行目: 204行目:
   
   
  [Service]
  [Service]
  Type=notify
  #Type=notify
  ExecStart=/home/suse/InstallSoftware/PHP/PHP8/sbin/php-fpm --nodaemonize --fpm-config /home/suse/InstallSoftware/PHP/PHP8/etc/php-fpm.conf
Type=simple
  ExecStart=/<PHPのインストールディレクトリ>/sbin/php-fpm --nodaemonize --fpm-config /<PHPのインストールディレクトリ>/etc/php-fpm.conf
  ExecReload=/bin/kill -USR2 $MAINPID
  ExecReload=/bin/kill -USR2 $MAINPID
   
   

2022年2月20日 (日) 06:25時点における版

概要

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

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


PHPのインストール

パッケージ管理システムからインストール

CentOS

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

sudo yum remove php-*


次に、YumリポジトリにEPELとRemiを追加する方法を参照して、EPELリポジトリとRemiリポジトリを追加する。

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

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


SUSE


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のバージョンをインストールする場合、ソースコードからインストールする方が融通が利く。

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

sudo zypper install ccache re2c gmp-devel zlib-devel libxml2-devel sqlite3-devel libopenssl-1_1-devel pcre-devel gd-devel libwebp-devel libjpeg62-devel libpng16-devel \
                    libXpm-devel freetype2-devel libXft-devel libcurl-devel icu libicu-devel oniguruma-devel libsodium-devel readline6-devel readline-devel  \
                    krb5-server krb5-devel unixODBC-devel libzip-devel


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-intl --enable-mbregex --enable-mbstring --enable-mysqlnd \
             --enable-opcache --enable-phpdbg --enable-phpdbg-debug --enable-sockets \
             --enable-sysvmsg --enable-sysvsem --enable-sysvshm --enable-shmop --enable-soap --enable-zts \
             --with-apxs2=<Apacheのインストールディレクトリ>/bin/apxs \
             --with-curl --with-expat -with-freetype --with-gettext --with-gmp --with-iconv --with-imap --with-imap-ssl --with-jpeg --with-kerberos \
             --with-libxml --with-openssl --with-pic --with-readline --with-sodium --with-xpm --with-zip --with-zlib --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-config-file-path=<php.iniファイルの配置するパス>  # ユーザが指定する場合

make -j $(nproc)
make install


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

vi ~/.profile


# ~/.profileファイル

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


Apacheの設定ファイルである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.iniファイルを配置する。
php.iniファイルの標準パスは、/<PHPのインストールディレクトリ>/lib64ディレクトリである。 configureスクリプト実行時に--with-config-file-path=オプションを指定することにより、php.iniファイルを配置するパスが変更できる。
なお、php --iniコマンドを実行することにより、php.iniファイルを配置するパスが表示される。

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

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


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 = /var/run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/php-fpm.log

# ...略


Webアプリケーションを使用する場合、PHP-FPMのwww.confファイルを作成する。 PHP-FPMを実行するには、使用するユーザアカウントを設定する必要がある。適切なアカウントを使用しないと、パーミッションエラーが発生する可能性がある。

使用するアカウントは、OSやWebサーバによって異なる。
例えば、NginXの場合、nginxというアカウントを使用する。
Apache2の場合、SUSEではwwwrun、Ubuntu / Debianではwww-data、CentOSではnobodyを使用する。

以下の設定例は、NginXが動作するサーバでの設定である。

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


vi www.conf


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

# www.confファイル

# ...略

user = <ユーザ名  例. nginx>
group = <グループ名  例. nginx>

listen.owner = <ユーザ名  例. nginx>
listen.group = <グループ名  例. nginx>

listen = /var/run/php-fpm/php-fpm.sock
security.limit_extensions = .php .php3 .php4 .php5 .php7 .php8 .html
php_admin_value[error_log] = /var/log/php-fpm/www.log
php_admin_flag[log_errors] = on

# ...略


アクセスファイルやログのパスを作成する。
初期設定のパスは、PHPのインストールディレクトリとなる。

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

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


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=notify
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



Apache2上でPHP 7の有効化

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

# モジュールを追加する場合
sudo a2enmod php7

# モジュールを削除する場合
sudo a2dismod php7


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

sudo systemctl restart apache2



確認方法

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

php -v


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


インストール時の注意点

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

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


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

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



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

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

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

以下の例では、複数のバージョンの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>



Xdebugのインストール

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