#author("2023-08-31T03:11:22+00:00","default:iseki","iseki") #author("2024-05-07T00:59:19+00:00","default:iseki","iseki") ** PHP: Hypertext Preprocessor [#k50e5340] *** Links [#b2d61ed1] - http://www.php.net/ - http://jp2.php.net/ (日本のミラーサイト) - 日本PHPユーザー会 (Japan PHP User Group) -- http://www.php.gr.jp/ - 非推奨関数とか,本当勘弁してもらいたい.C言語を見習え! *** Version [#r6fc27c8] - [[PHP7 >./PHP7]] - [[PHP8 >./PHP8]] *** Install [#g3ac2181] - --enable-intl を指定する場合は libicu-devel (ユニコード用の国際化コンポーネント) が必要 - --enable-opcache OPCache 使用 (5.5.x~) - MariaDBのライブラリに libmysqlclient を使用すると MYSQL_UNIX_ADDR未解決のコンパイルエラが発生する (5.6.36) -- DBのライブラリに mysqlnd を使用する - OpenSSL-1.1.x を使用している場合 -- OpenSSL-1.1.x を使用している場合は, /usr/local/lib にライブラリが必要.シンボリックリンクを張っておく. -- OpenSSL-1.1.x を使用している場合は以下の様にしてから,configure を実行. cd /usr/local/ssl ln -s /usr/local/include . ln -s /usr/local/lib64 lib cd (php-source) - PHP-5.6 + OpenSSL-1.1 の場合は パッチを当てる.[[php56.36-openssl11.patch>http://www.nsl.tuis.ac.jp/DownLoad/SoftWare/PHP/php56.36-openssl11.patch]] -- see also https://bugs.php.net/patch-display.php?bug_id=73741&patch=php56-openssl11&revision=latest **** configure [#la6d7565] # zcat php-5.x.y.tar.gz |tar xfv - # cd php-5.x.y #./configure --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd \ --with-apxs2=/usr/local/apache/bin/apxs \ --with-openssl=/usr/local/ssl --with-zlib=/usr \ --enable-mbstring --with-iconv --enable-intl \ --enable-zip --enable-soap --enable-pcntl \ --enable-sockets --with-curl --with-xmlrpc --enable-opcache \ --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir=/usr # make # make test # make install **** configure オプションの修正 [#u42ccc8f] - PHP7 + OpenSSL1.1 の場合は --with-openssl=/usr/local -- /usr/local/lib に openssl のライブラリが必要 - DBのライブラリに libmysqlclient を使用する場合は以下のオプションを指定 --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql *** 設定 [#y94248ee] **** Cache [#v59a24e5] **** 設定ファイル [#pd46cce5] - /usr/local/lib/php.ini -- ソースディレクトリの php.ini-* をコピー **** Short Open Tag [#u7a17883] - <? ... ?>, <?=... > 等の Short Open Tag を有効にするには,設定ファイルで以下のように設定する. short_open_tag = On *** Upload サイズを増やす - php.ini -- upload_max_filesiz -- post_max_size *** MySQL [#f960f3f5] - 処理中の文字コードを UTF-8にする場合 mb_internal_encoding("utf-8"); mysql_set_charset('utf8'); または mb_internal_encoding("utf-8"); mysql_query("SET NAMES utf8", $db); - mb_internal_encoding("utf-8") は php.ini でも指定可能. - SET NAMES utf8 でクエリの文字コードを指定可能. *** PHP 関数拡張 [#q614929b] - [[PHP Extension]] - [[Sodium>PHP Extension/Sodium]] *** Trouble Shooting [#t160986a] **** エラーログ [#u1a71917] - /etc/php.ini の error_log, log_errors で設定 - パーミッションに注意 log_errors = On error_log = /var/log/php/php.log - ただし php-fpm が動いている場合は,Web上でのエラーは error_log に出ない. -- /var/log/php-fpm/www-error.log -- どこで指定してるんだ! ぷんぷん! -- /etc/php-fpm.d/www.conf php_admin_value[error_log] = /var/log/php-fpm/www-error.log **** dl() でモジュールを呼んでくれない [#v9ecf83f] - php.ini で enable_dl = On とする. **** php.ini の設定が反映されない [#df20ad07] - php -i |grep php.ini で PHPが実際に読み込んでいる php.ini を調べる - PHPが WWWサーバのモジュールとしてではなく,php-fpm で動いている場合は,php-fpm を再起動する必要がある. systemctl restart php-fpm **** CetOS8 / Rocky Linux8 で PHPを 7.2から 7.4 にする [#l84ed33f] dnf module list php dnf module reset php dnf module enable php:7.4 -y yum erase php yum install php --allowerasing *** PHP errors [#yba82631] **** opcache.so: undefined symbol: sapi_globals, opcache.so: undefined symbol: core_globals_id [#rb49ddd0] - yum でPHPを入れたまま,PHPの最新版をコンパイルして入れたら,ログに出力されるようになった. - yum で 古いPHPを削除したところ発生しなくなった. yum remove 'php-*' **** doesn't appear to be a valid Zend extension [#e2c14635] - 5.6.3 で自作の拡張関数(.so)を読ませようとしたところ,発生.関数も読み込まれない - php.ini に zend_extension ではなく extension でモジュールを記述したところOK - モジュールは /usr/local/lib/php/extensions/php_tuis_auth.so - /usr/local/lib/php.ini extension=php_tuis_auth.so **** AH00052: child pid # exit signal Segmentation fault (11) [#s08c8197] - PHP 5.5.12 で発生. - PHP 5.6.3 にアップデータしたところ,エラーが出なくなる - Apache のworkerの問題かも **** Notice: Undefined index: [#c3c0d432] - apacheと連携させて、次の様なエラーが出る時(一例)~ ''Notice: Undefined index:''~ php.iniの error_reporting = E_ALL を error_reporting = E_ALL & ~E_NOTICE に変更。~ 基本的には、エラー文の接頭語にあたる"※※※:"の※部分を"~E_※※※"として、今までのerror_reportingに対して&で繋いでいく。~ ~ - apacheと連携(ry(二例)~ "Deprecated: Assigning the ~"~ error_reporting = E_ALL を error_reporting = E_ALL & ~E_DEPRECATED に変更。~ ~ - apacheと(ry(三例)~ ''Notice:''と''Deprecated:''の両方だと~ error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED になる。問題先延ばしだが、開発者以外なら問題なかろう