skimemo


skimemo - 日記/2019-12-05

_ Windows上のApacheでPHP5とPHP7を共存させる

_ 概要

  • WindowsでPHP5とPHP7を共存させる
  • PHP5はモジュール版で、PHP7はfirst-cgiで動かす

Windowsの開発環境でPHP5と7を共存させる方法です。
WindowsのApache+PHPの組み合わせには、VCランタイムの問題が絡むので、PHP7はfirst-cgiで動作させて切り離してみました。

_ 手順

  1. PHP7のダウンロード
    こちらのページから、適当なNon Thread Safe版のzipをダウンロードして解凍して適当なディレクトリに配置します。

  2. php.iniの設定
    解凍したディレクトリに配置されているphp.ini-developmentをコピーして、php.iniを作成します。

  3. php-fpmの起動
    解凍したディレクトリでphp-fpmを起動します。
    > php-cgi.exe -b 127.0.0.1:8073

  4. apache(httpd.conf)の設定
    必要なモジュールを読み込ませます。
    LoadModule mime_module modules/mod_mime.so
    LoadModule proxy_module modules/mod_proxy.so
    ローカル環境ではVirtualHostではなくaliasを使う場合が多いと思います。以下のように設定します。
    Alias /hoge "C:\Users\fuga\Documents\html\hoge"
    <Directory "C:\Users\fuga\Documents\html\hoge">
    	ProxyFCGIBackendType GENERIC
    	<FilesMatch \.php$>
    		SetHandler "proxy:fcgi://127.0.0.1:8073#"
    	</FilesMatch>
    	AllowOverride all
       Require all granted
    </Directory>
    CentOS版と異なるのは、3行目のProxyFCGIBackendType GENERICと、5行目の行末に#が入っているあたりです。

    また、長い処理がタイムアウトにならないよう、適当な時間を設定してあげます。これは、xdebugなどでステップ実行している時間も算入されますので、デバッグする場合は長めにする必要があります。ちなみにこれは<Directory>〜</Directory>の外に置く必要があります。
    ProxyTimeout 600

  5. apacheの再起動
    サービスからApacheを再起動し、ブラウザでアクセスできれば成功です。

_ php-cgiのコマンドプロンプト

DOS窓が邪魔な場合は、RunHiddenConsoleというのがあるようです。

_ php-cgi実行時の設定

php-cgi.exeをただ起動しただけではプロセスが1つしか起動せず、処理可能な同時コネクション数も1つになります。
このままでは、SPAなどのブラウザから同時に複数のアクセスが走るような処理ではパフォーマンスが大幅に悪くなってしまいます。
そこで、以下のように設定を入れてあげます。

@ECHO OFF
set PHP_FCGI_CHILDREN=8
set PHP_FCGI_MAX_REQUESTS=10000
RunHiddenConsole.exe php-cgi.exe -b 127.0.0.1:8073

このとき、設定変数の意味はそれぞれ以下の通りです。

環境変数意味
PHP_FCGI_CHILDREN起動する子プロセス数を指定します。上記の様に8を指定すると、8個のプロセスが起動します。
PHP_FCGI_MAX_REQUESTS子プロセスが起動中に処理できるリクエスト数を指定します。指定回数処理すると自動終了します。(参考URL(iii)参照。記事中では(当時は)Windowsでは使用不可と書かれていますが、今は使えるようです)

_ 参考

  1. Apache and PHP-FPM in Windows
  2. [インストール]windows + nginx + php + pukiwiki
  3. なぜ、Windowsでphp-cgiが自動で終了してしまうのか?
Category: [Windows] - 13:57:42


_ CentOS7+ApacheでPHP5とPHP7を共存させる

_ 概要

  • もともとApache+PHP5.6で動いているサーバー
  • 既存の環境には影響を与えたくない
  • 新たなVirtualHostだけPHP7で動作させる

これらを実現するため、PHP5.6は今まで通りモジュールで動かし、PHP7はfcgiで動かします。

_ 手順

  1. PHP7.3のインストール
    sudo yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
    sudo yum install yum-utils
    sudo yum-config-manager --enable remi
    sudo yum install php73-php-{opcache,pecl-apcu,pecl-memcached,cli,gd,mbstring,mcrypt,mysqlnd,pdo,xml}
    sudo yum install php73-php-fpm
    remiリポジトリでインストールすると、既存のPHP5環境には影響を与えず、別のディレクトリ群にPHP7をインストールすることができます。

  2. php-fpmの設定
    sudo vi /etc/opt/remi/php73/php-fpm.d/www.conf
    以下の部分を変更します。(UNIX socketで接続するケース)
    listen = /var/run/php-fpm/php-fpm.sock
    listen.owner = apache
    listen.group = apache
    listen.mode = 0660
    pidファイルを作成するためのディレクトリを作ります。
    sudo mkdir /var/run/php-fpm

  3. Apacheの設定
    sudo vi /etc/httpd/conf.d/vhost.conf
    php-fpmとの連携を追記します。
    <VirtualHost *:443>
       ServerName vhost.example.jp
       DocumentRoot /var/www/hoge
       <FilesMatch \.php$>
           SetHandler proxy:unix:/var/run/php-fpm/php-fpm.sock|fcgi://localhost
       </FilesMatch>
             :
    </VirtualHost>
    通常のVirtualHost設定に、<FilesMatch>〜</FilesMatch>部分を追加するだけです。

    また、長い処理がタイムアウトにならないよう、適当な時間を設定してあげます。これは、xdebugなどでステップ実行している時間も算入されますので、デバッグする場合は長めにする必要があります。
    ProxyTimeout 300

  4. 起動
    sudo systemctl start php73-php-fpm
    sudo systemctl enable php73-php-fpm
    sudo systemctl reload httpd

上記の例で言うと、/var/www/hoge/index.phpなどを作って、https://vhost.example.jp/にアクセスし、表示されれば成功です。
この方法であれば、恐らく(試してないけど)何個でも異なるバージョンのPHPを共存させることが可能だと思います。(その場合sockファイル名は分ける)

_ 参考

Category: [Linux] - 12:11:43



 
Last-modified: 2019-12-05 (木) 12:11:43 (363d)