PHPの設定



●Rocky Linux 9にPHP 8.1をインストールする

 参考URL:Rocky Linux 9にPHP 8.1をインストールする方法

 OSのバージョンを確認します。
# cat /etc/redhat-release 
Rocky Linux release 9.1 (Blue Onyx)
 普通にPHPをインストールしようとすると、PHP 8.0をインストールしようとします。
# dnf install php

依存関係が解決しました。
====================================================================================================================================
 パッケージ                          アーキテクチャー         バージョン                          リポジトリー                サイズ
====================================================================================================================================
インストール:
 php                                 x86_64                   8.0.20-3.el9                        appstream                    11 k
依存関係のインストール:
 apr                                 x86_64                   1.7.0-11.el9                        appstream                   123 k
 apr-util                            x86_64                   1.6.1-20.el9                        appstream                    94 k
 apr-util-bdb                        x86_64                   1.6.1-20.el9                        appstream                    13 k
 httpd-core                          x86_64                   2.4.53-7.el9                        appstream                   1.4 M
 httpd-filesystem                    noarch                   2.4.53-7.el9                        appstream                    15 k
 httpd-tools                         x86_64                   2.4.53-7.el9                        appstream                    82 k
 nginx-filesystem                    noarch                   1:1.20.1-13.el9                     appstream                    11 k
 oniguruma                           x86_64                   6.9.6-1.el9.5                       appstream                   217 k
 php-common                          x86_64                   8.0.20-3.el9                        appstream                   665 k
 rocky-logos-httpd                   noarch                   90.14-1.el9                         appstream                    24 k
弱い依存関係のインストール:
 apr-util-openssl                    x86_64                   1.6.1-20.el9                        appstream                    15 k
 httpd                               x86_64                   2.4.53-7.el9                        appstream                    48 k
 mod_http2                           x86_64                   1.15.19-2.el9                       appstream                   149 k
 mod_lua                             x86_64                   2.4.53-7.el9                        appstream                    62 k
 php-cli                             x86_64                   8.0.20-3.el9                        appstream                   3.1 M
 php-fpm                             x86_64                   8.0.20-3.el9                        appstream                   1.6 M
 php-mbstring                        x86_64                   8.0.20-3.el9                        appstream                   471 k
 php-opcache                         x86_64                   8.0.20-3.el9                        appstream                   512 k
 php-pdo                             x86_64                   8.0.20-3.el9                        appstream                    84 k
 php-xml                             x86_64                   8.0.20-3.el9                        appstream                   133 k

トランザクションの概要
====================================================================================================================================
インストール  21 パッケージ

ダウンロードサイズの合計: 8.7 M
インストール後のサイズ: 42 M
これでよろしいですか? [y/N]: N
操作が中断されました。
 2023年2月現在、Rocky Linux 9ではPHP 8.1をインストールできるようなので確認します。
# dnf module list php

Rocky Linux 9 - AppStream
Name                   Stream                   Profiles                                     Summary                                
php                    8.1                      common [d], devel, minimal                   PHP scripting language                 

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled
 PHP 8.1をインストールします。 
#  dnf module install php:8.1 -y

依存関係が解決しました。
====================================================================================================================================
 パッケージ                    アーキテクチャー    バージョン                                          リポジトリー           サイズ
====================================================================================================================================
group/moduleパッケージをインストール:
 php-cli                       x86_64              8.1.8-1.module+el9.1.0+13171+4883e0c8               appstream              3.5 M
 php-common                    x86_64              8.1.8-1.module+el9.1.0+13171+4883e0c8               appstream              667 k
 php-fpm                       x86_64              8.1.8-1.module+el9.1.0+13171+4883e0c8               appstream              1.8 M
 php-mbstring                  x86_64              8.1.8-1.module+el9.1.0+13171+4883e0c8               appstream              475 k
 php-xml                       x86_64              8.1.8-1.module+el9.1.0+13171+4883e0c8               appstream              142 k
依存関係のインストール:
 httpd-filesystem              noarch              2.4.53-7.el9                                        appstream               15 k
 nginx-filesystem              noarch              1:1.20.1-13.el9                                     appstream               11 k
 oniguruma                     x86_64              6.9.6-1.el9.5                                       appstream              217 k
モジュールプロファイルのインストール中:
 php/common                                                                                                                        
モジュールストリームの有効化中:
 php                                               8.1                                                                             

トランザクションの概要
====================================================================================================================================
インストール  8 パッケージ
 :
 :
完了しました!
 インストール状況を確認します。
# dnf module list php

Rocky Linux 9 - AppStream
Name                  Stream                   Profiles                                       Summary                               
php                   8.1 [e]                  common [d] [i], devel, minimal                 PHP scripting language                

ヒント: [d]efault, [e]nabled, [x]disabled, [i]nstalled
 PHPを設定します。
# vi /etc/php.ini

expose_php = On
 ↓
expose_php = Off
 
;date.timezone =
 ↓
date.timezone = 'Asia/Tokyo'
 
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
 ↓
error_reporting = E_ALL & ~E_NOTICE
 php-fpmが自動起動するように設定します。
systemctl enable --now php-fpm


●PHP 8.0(ソース)のインストール

 PHP 8.0を更新する方法はこちらに記載しています。

●インストール

・ソースからのインストール

 http://www.php.net/downloads.phpから、インストールしたいバージョンをダウンロードします。
$ cd /usr/local/src
$ tar zxvf php-5.2.9.tar.gz
$ cd php-5.2.9
$ ./configure --with-apxs2=/usr/sbin/apxs「libphp5.so」インストールのため
$ make
$ su
# make install
 make installを実行したら、あとはphp.ini-recommendedを/usr/local/lib/php.iniにコピーします。

●設定ファイルの変更

 必要があれば、「php.ini」の設定を変更します。
php.iniのインクルードパスの変更を行います。
;include_path = ".:/php/includes"
↓
include_path = ".:/usr/local/include/php:/usr/local/lib/php"
php.iniのドキュメントルートのパス設定を行います。
doc_root = "/usr/local/apache2/htdocs"
php.iniの拡張モジュールのパスを変更します。
extension_dir = "/usr/local/include/php/ext"
必要に応じて、php.iniの文字コード等の設定を以下の様にUTF-8用に変更します。
コメントアウトされているものについては、コメントを外します。
output_buffering = On
output_handler = mb_output_handler
default_charset = "UTF-8"
mbstring.language = Japanese
mbstring.internal_encoding = UTF8
mbstring.http_output = UTF8

●動作確認用PHPスクリプトの作成

 Apacheは問題なくインストールされているものとします。
 ここでは、PHPが正しく動作しているかを確認するために、PHPのインストール環境を表示するスクリプトを作成します。
 Apacheのドキュメントルート「/var/www/html(注)」に「info.php(サンプル1)」を作成します。
 :ソースからインストールした場合は「/usr/local/apache2/htdocs」がドキュメントルートになります。
$ vi info.php
<?php
phpinfo();
?>
 PHPスクリプトは「<?php」で始まり「?>」で終わります。その間に「phpinfo();」のようなコードを記述します。その際、行末には必ず「;」を付加します。phpinfo関数はPHPインストール環境を表示します。簡単なサンプルですが、サーバ環境を表示できるので開発時には重宝します(注)。なお、PHPスクリプトファイルの拡張子は「.php」になるように保存します。
 :セキュリティ管理上、サーバ環境の情報を簡単に表示できてしまうのは不用心なので、必要ない場合は削除しましょう。
 作成したら、Webブラウザで「http://127.0.0.1/info.php」にアクセスします。情報の一覧が表示されれば正常です。
 「info.php」がそのまま表示されてしまう場合は、Apacheの設定ファイルで下記のような記載がないか、または、Apacheの設定ファイルでPHP用のモジュールが読み込まれていない可能性があります。
AddType application/x-httpd-php .php
 そこで、/etc/httpd/conf.d/php.confを作成します。
# vi /etc/httpd/conf.d/php.conf ← php.conf作成
#
# PHP is an HTML-embedded scripting language which attempts to make it
# easy for developers to write dynamically generated webpages.
#
LoadModule php5_module modules/libphp5.so
#
# Cause the PHP interpreter to handle files with a .php extension.
#
AddHandler php5-script .php
AddType text/html .php
#
# Add index.php to the list of files that will be served as directory
# indexes.
#
DirectoryIndex index.php
#
# Uncomment the following line to allow PHP to pretty-print .phps
# files as PHP source code:
#
#AddType application/x-httpd-php-source .phps
 Apacheを再起動したら、「libphp5.so」が無いと言われたので、コンパイル時に「--with-apxs2=/usr/sbin/apxs」を付加して、PHPを再インストールします。
 Apacheを再起動・・するが、新たなエラーが・・。
httpd: Syntax error on line 207 of /etc/httpd/conf/httpd.conf: Cannot load /usr/lib/httpd/modules/libphp5.so into server: \
/usr/lib/httpd/modules/libphp5.so: undefined symbol: sqlite3ExprDelete
 sqlite3がインストールされていないようなので、「sqlite」をhttp://www.sqlite.org/からダウンロードします。
$ cd /usr/local/src
$ tar zxvf sqlite-3.6.15.tar.gz
$ cd sqlite-3.6.15
$ ./configure
$ make
$ su
# make install
 下記のようにインストールされます。
/usr/bin/install -c -d /usr/local/bin
./libtool --mode=install /usr/bin/install -c sqlite3 /usr/local/bin
libtool: install: /usr/bin/install -c .libs/sqlite3 /usr/local/bin/sqlite3
/usr/bin/install -c -d /usr/local/include
/usr/bin/install -c -m 0644 sqlite3.h /usr/local/include
/usr/bin/install -c -m 0644 ./src/sqlite3ext.h /usr/local/include
/usr/bin/install -c -d /usr/local/lib/pkgconfig
/usr/bin/install -c -m 0644 sqlite3.pc /usr/local/lib/pkgconfig
 再度、PHPをコンパイル・・。
$ ./configure --with-apxs2=/usr/sbin/apxs --with-sqlite=/usr/local/include
1回目のコンパイル失敗
$ ./configure --with-apxs2=/usr/sbin/apxs --with-sqlite=/usr/local/lib
2回目のコンパイル失敗
 いろいろ試してみるが、どうしてもPHPのconfigure時に下記のエラーが表示されてしまうので、
configure: error: wrong sqlite lib version or lib not found
 make cleanを実行。再度、PHPのconfigure、make、make installを実行。Apacheも起動。
$ cd /usr/local/src/php-5.2.9
$ ./configure --with-apxs2=/usr/sbin/apxs
$ ./configure
$ make
$ su
# make install
「LoadModule php5_module /usr/lib/httpd/modules/modules/libphp5.so」が追加され、
新しい「httpd.conf」に変更される。
# vi /etc/httpd/conf.d/php.conf ← 上記で作成した「php.conf」を編集
# LoadModule php5_module modules/libphp5.so ← コメントアウトする
# service httpd start ← Apacheの起動
 何事もなくApacheが立ち上がりました・・。
 sqliteをインストール後、PHPのconfigure時に「--with-apxs2=/usr/sbin/apxs」を付加し、インストールすればいいみたい。
 Webブラウザで「http://127.0.0.1/info.php」にアクセスすると、情報の一覧が表示されました。

●MySQLとの連携

 PHPのconfigure時に「--with-mysql」を付加し、インストールします。
 データベースは●データベースの作成を参照して作成してください。

 動作確認スクリプトの作成1

 /var/www/html/test_mysql.phpを以下のように作成します。
# vi /var/www/html/test_mysql.php ← test_mysql.phpの作成
<?php
mysql_connect("localhost","root","") or die("Error MySQL First Test");
echo "Success MySQL First Test";
?>
 http://(Webサーバ名)/test_mysql.phpにアクセスすることにより、DBへの接続状況を確認することができます。
 MySQLサーバへの接続に成功した場合「Success MySQL First Test」、失敗した場合「Error MySQL First Test」と表示されます。

 動作確認スクリプトの作成2

 /var/www/html/test_mysql2.phpを以下のように作成します。
# vi /var/www/html/test_mysql2.php ← test_mysql2.phpの作成
<html>
<head>
<meta http-equiv=content-type content="text/html; charset=UTF-8">
<title>PHPのテスト</title>
</head>
<body>
<?php
//初期設定
$username = "myuser"; ← データベース「auth」へアクセス可能なユーザ
$password = "mypass"; ← 上記ユーザ用のパスワード
$dbname = "auth";
$sql = "select * from city";
  // サーバ接続
  $con = mysql_connect("localhost","$username","$password") or die("接続失敗:" . mysql_error());
  // データベースを選択
  mysql_select_db($dbname,$con) or die("DBがありません:" . mysql_error());
  // 文字化け防止のおまじない
//  $strsql = "SET CHARACTER SET UTF8";
  // SQLの実行
  $res = mysql_query($sql,$con);
  print "照会件数= " . mysql_num_rows($res) . "<br />";
  // 展開
  while ($item = mysql_fetch_array($res)) {
    	print $item[0]." ".$item[1]."<br />";
  }
  // 接続をクローズ
  mysql_close($con) or die("MySQL切断に失敗しました。");
?>
</body>
</html>


 動作確認スクリプトの作成3

 /var/www/html/test_mysql_pdo.phpを以下のように作成します。
<html>
<head>
<title>PHP MySQL TEST</title>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
</head>

<body>

<h2>DB接続テスト(PHP MySQL pdo版)</h2>

<?php
$server = 'localhost';
$user = 'myuser';
$pass = 'mypass';
$dbname = 'auth';

$my = new MySQLi($server, $user, $pass, $dbname);
$my->set_charset('utf8');
$sql = "SELECT * FROM `city` LIMIT 0 , 30";
$result = $my->query($sql);
	// データベースの中身を取得
	while($row = $result->fetch_assoc() ){
		echo $row['country'] . " / ";
		echo $row['capital'] . "<br>";
	}

// DB接続を閉じる
$my->close();
?>

</body>
</html>


●PostgreSQLとの連携

 PHPのconfigure時に「--with-pgsql」を付加し、インストールします。
 テストデータベースは●テストデータベース作成参照して作成してください。

動作確認スクリプトの作成

 php-pgsqlのインストールと利用を参照してください。

●異種バージョンの同居

 参考URL:さくらVPSでphp5.3/5.2/5.1 が同居する環境を構築してみた
 参考URL:php::Apacheに複数バージョンのphpを共存させる

 CentOS 7で5.3.3と5.1.6が別々に動作できるよう設定してみましたので、その時の作業を記録します。
 5.1.6で動作させたいフォルダを仮に「/home/test/public_html」とします。
 5.3.3はyumでインストール済みです。5.1.6のtarボールをダウンロードしCGIとして設定します。
# cd /usr/local/src
# wget http://museum.php.net/php5/php-5.1.6.tar.gz
# tar zxvf php-5.1.6.tar.gz
コンフィグするのに不足したモジュールをyumでインストール
※環境により必要なモジュールは異なる
# yum install flex libxml2 libxml2-devel
コンフィグのオプションは環境により異なるので参考程度に・・・
# LDFLAGS=-L/usr/lib64/mysql ./configure --prefix=/usr/local/lib/php-5.1.6 --with-config-file-path=/usr/local/lib/php-5.1.6 \
--libdir=/usr/lib64 --with-zlib --with-zlib-dir=/usr/include/ --enable-fastcgi \
--enable-cgi --enable-force-cgi-redirect --enable-mbstring --enable-mbstr-enc-trans \
--enable-track-vars --enable-mbregex --with-mysql=/usr/lib/mysql --with-mysqli=/usr/lib/mysql/mysql_config --with-gd \
--with-jpeg-dir=/usr/lib64 --with-png-dir=/usr/lib64 --program-suffix=516 --enable-zend-multibyte
# make
# make install
 apacheの設定ファイルを変更します。
# cp /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
# vi /etc/httpd/conf/httpd.conf
※変更した箇所のみ記載
UserDir enabled test ← 該当フォルダのユーザのみ許可
UserDir public_html ← コメントアウト
<Directory /home/*/public_html> ← コメントアウト
    AllowOverride FileInfo AuthConfig Limit ← コメントアウト
    Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec FollowSymLinks ← コメントアウト
</Directory> ← コメントアウト
<Directory "/var/www/cgi-bin">
    AllowOverride None
    Options FollowSymLinks ← 変更
    Order allow,deny
    Allow from all
</Directory>
# service httpd restart
# cd /var/www/cgi-bin
# ln -s /usr/local/lib/php-5.1.6/bin/php516 php516
 5.1.6で動作させたいフォルダは「/home/test/public_html」ですので、ここに.htaccessを設置します。
$ /home/test/public_html/.htaccess
AddHandler php516-script .php
Action php516-script /cgi-bin/php516
 動作確認のため.htaccessと同じ箇所にtest.phpを設置します。
$ /home/test/public_html/test.php
<?php
phpinfo();
?>
 http://<サーバ名>/~test/test.phpにアクセスし、表示される結果が5.1.6であれば問題なく動作しています。

●「現在このリクエストを処理できません。」と表示される

 あるPHPにアクセスすると下記のようなエラーが表示されるようになりました。
このページは動作していません
tori.bigbang.mydns.jp では現在このリクエストを処理できません。
HTTP ERROR 500
 
# tail -f /var/log/php-fpm/www-error.log
[23-Jan-2022 22:57:17 Asia/Tokyo] PHP Warning:  include_once(/var/www/html/***/***/xxx.php): failed to open stream: Permission denied in /var/www/html/yyy.php on line 7
[23-Jan-2022 22:57:17 Asia/Tokyo] PHP Warning:  include_once(): Failed opening './***/***/xxx.php' for inclusion (include_path='.:/usr/share/pear:/usr/share/php') in /***/***/xxx.php on line 7
[23-Jan-2022 22:57:17 Asia/Tokyo] PHP Fatal error:  Uncaught Error: Call to undefined function rssGen() in /var/www/html/yyy.php:10
Stack trace:
#0 {main}
  thrown in /var/www/html/yyy.php on line 10
 いろいろ調べた結果、アクセスしたPHPから呼び出すPHPのアクセス権がおかしくなっていることに気が付きました。
 これを下記のように変更することで解決しました。
# ll /var/www/html/***/***/xxx.php
-r--rw---- 1 root wheel 16012  3月  1  2019 /var/www/html/***/***/xxx.php

# chmod 664 /var/www/html/***/***/xxx.php
 これにより表示できるようになりました。