カテゴリー : PHP

[PHP-FPM] WARNING: [pool www] server reached pm.max_children setting (30), consider raising it

WordPress (Nginx + PHP-FPM) なサイトで Admin ページで Bad Gateway を頻発させていました。

Nginx のエラーログ

tail -F /var/log/nginx/codenote.net/error.log 

[error] 3029#0: *12410 connect() to unix:/var/run/php-fpm/www.sock failed (11: Resource temporarily unavailable) while connecting to upstream, client: 185.11.147.17, server: codenote.net, request: "POST /xmlrpc.php HTTP/1.1", upstream: "fastcgi://unix:/var/run/php-fpm/www.sock:", host: "codenote.net"

PHP-FPM のエラーログ

tail -F /var/log/php-fpm/error.log

WARNING: [pool www] server reached pm.max_children setting (30), consider raising it

エラーログに書いてあるように pm.max_children の設定値の上限に達しているので設定値を上げて解決させましょう。

# vim /etc/php-fpm.d/www.conf
# 30 で上限に達していたので適当に 50 に上げてみましょう
 
pm.max_children = 50

設定変更した後、PHP-FPM を reload して設定を反映させます。

service php-fpm reload

再度 tail -F /var/log/php-fpm/error.log でエラーログを監視して WARNING メッセージが表示されなくなったら解決できたと思います。

まだ WARNING メッセージが表示されていたら、更に pm.max_children を 60, 70 と上げていってメッセージが出力されなくなるまで調整しましょう。

[PHP-FPM] recv() failed (104: Connection reset by peer)

Nginx + PHP-FPM 構成で、502 bad gateway が頻発する問題が発生しました。

エラーログ

2013/09/15 19:02:06 [error] 2281#0: *23 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 125.1.92.146, server: codenote.net, request: “GET /php/1322.html HTTP/1.1”, upstream: “fastcgi://unix:/var/run/php-fpm/www.sock:”, host: “codenote.net”

request_terminate_timeout が短すぎるのが原因だったので、120秒に変更することで解決しました。

# vim /etc/php-fpm.d/www.conf
request_terminate_timeout = 120s

参考情報

ブログが表示されなくなる(nginx+WordPressで500エラー) | 魚座時代

Network is unreachable: nginx+PHP-FPMでどこまでチューニングできるか

[Mac] PHP5.4 を Homebrew でインストール

Mac に PHP5.4 を Homebrew でインストールしたのでメモ。

デフォルトでは、PHPのFormulaは無いので、homebrew-phpを使ってインストールします。

brew tap homebrew/dupes
brew tap josegonzalez/homebrew-php

PHP5.4 のインストールオプションを確認します。

% brew options php54
--32-bit
	Build 32-bit only.
--homebrew-apxs
	Build against apxs in Homebrew prefix
--with-cgi
	Enable building of the CGI executable (implies --without-apache)
--with-debug
	Compile with debugging symbols
--with-fpm
	Enable building of the fpm SAPI executable (implies --without-apache)
--with-gmp
	Build with gmp support
--with-homebrew-openssl
	Include OpenSSL support via Homebrew
--with-imap
	Include IMAP extension
--with-intl
	Include internationalization support
--with-libmysql
	Include (old-style) libmysql support
--with-mssql
	Include MSSQL-DB support
--with-pgsql
	Include PostgreSQL support
--with-thread-safety
	Build with thread safety
--with-tidy
	Include Tidy support
--with-unixodbc
	Build with unixodbc support
--without-apache
	Build without shared Apache 2.0 Handler module
--without-bz2
	Build without bz2 support
--without-mysql
	Remove MySQL/MariaDB support
--without-pear
	Build without PEAR
% brew install php54 \
> --with-fpm \
> --with-homebrew-openssl \
> --with-intl \
> --with-pgsql
 
...
 
==> make install
==> /usr/local/Cellar/php54/5.4.16/bin/pear config-set php_ini /usr/local/etc/php/5.4/php.ini
==> Caveats
The php.ini file can be found in:
    /usr/local/etc/php/5.4/php.ini
 
✩✩✩✩ PEAR ✩✩✩✩
 
If PEAR complains about permissions, 'fix' the default PEAR permissions and config:
    chmod -R ug+w /usr/local/Cellar/php54/5.4.16/lib/php
    pear config-set php_ini /usr/local/etc/php/5.4/php.ini
 
✩✩✩✩ Extensions ✩✩✩✩
 
If you are having issues with custom extension compiling, ensure that this php is
in your PATH:
    PATH="$(brew --prefix josegonzalez/php/php54)/bin:$PATH"
 
PHP54 Extensions will always be compiled against this PHP. Please install them
using --without-homebrew-php to enable compiling against system PHP.
 
✩✩✩✩✩ INTL Support ✩✩✩✩✩
 
icu4c is broken as of mxcl/homebrew#03ed757c, so you will need to install intl as
a separate extension:
 
    brew install php54-intl
 
✩✩✩✩ FPM ✩✩✩✩
 
To launch php-fpm on startup:
    * If this is your first install:
        mkdir -p ~/Library/LaunchAgents
        cp /usr/local/Cellar/php54/5.4.16/homebrew-php.josegonzalez.php54.plist ~/Library/LaunchAgents/
        launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php54.plist
 
    * If this is an upgrade and you already have the homebrew-php.josegonzalez.php54.plist loaded:
        launchctl unload -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php54.plist
        cp /usr/local/Cellar/php54/5.4.16/homebrew-php.josegonzalez.php54.plist ~/Library/LaunchAgents/
        launchctl load -w ~/Library/LaunchAgents/homebrew-php.josegonzalez.php54.plist
 
The control script is located at /usr/local/Cellar/php54/5.4.16/sbin/php54-fpm
 
Mountain Lion comes with php-fpm pre-installed, to ensure you are using the brew version you need to make sure /usr/local/sbin is before /usr/sbin in your PATH:
 
  PATH="/usr/local/sbin:$PATH"
 
You may also need to edit the plist to use the correct "UserName".
 
Please note that the plist was called 'org.php-fpm.plist' in old versions
of this formula.
 
To have launchd start php54 at login:
    ln -sfv /usr/local/opt/php54/*.plist ~/Library/LaunchAgents
Then to load php54 now:
    launchctl load ~/Library/LaunchAgents/homebrew.mxcl.php54.plist
Warning: /usr/local/sbin is not in your PATH
You can amend this by altering your ~/.bashrc file
==> Summary
/usr/local/Cellar/php54/5.4.16: 490 files, 38M, built in 5.1 minutes

Pear の設定

% chmod -R ug+w /usr/local/Cellar/php54/5.4.16/lib/php
% pear config-set php_ini /usr/local/etc/php/5.4/php.ini
config-set succeeded

php54-intl のインストール

% brew install php54-intl

[PHP] ./configure へ指定したオプションの確認方法

PHP で、./configure へ指定したオプションを確認する方法をメモ。

[方法その1] config.nice を確認する

./configure した、ソースファイルのディレクトリへ移動して、config.nice ファイルの中身を確認します。

cat config.nice

[方法その2] php -i を確認する

2つ目は、phpinfo を確認する方法です。

php -i | grep './configure'

[参考]:PHPのコンパイルオプションの調査 – takami_hirokiの日記

[Apache][PHP4] Cannot load /etc/httpd/modules/libphp4.so into server: libpq.so.2.1: cannot open shared object file: No such file or directory

Apache + PHP4 + PostgreSQL で下記のようなエラーが出た場合の解決方法をメモ。

libphp4.so で使う libpq.so.2.1 が無いというエラーです。

# /etc/init.d/httpd configtest
Syntax error on line 941 of /etc/httpd/conf/httpd.conf:
Cannot load /etc/httpd/modules/libphp4.so into server: libpq.so.2.1: cannot open shared object file: No such file or directory

libphp4.so のダイナミックリンクの関係を表示して確認すると、libpq.so.2.1 => not found となっていることが確認できます。

# ldd /etc/httpd/modules/libphp4.so
	libpam.so.0 => /lib/libpam.so.0 (0x40177000)
	libdl.so.2 => /lib/libdl.so.2 (0x40180000)
	libpq.so.2.1 => not found
	libcrypt.so.1 => /lib/libcrypt.so.1 (0x40184000)
	libresolv.so.2 => /lib/libresolv.so.2 (0x401b2000)
	libm.so.6 => /lib/libm.so.6 (0x401c4000)
	libnsl.so.1 => /lib/libnsl.so.1 (0x401e6000)
	libc.so.6 => /lib/libc.so.6 (0x401fd000)
	/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
# find / -name libpq.so.2.1
/usr/local/src/postgresql-7.0.3/src/interfaces/libpq/libpq.so.2.1
/usr/local/pgsql/lib/libpq.so.2.1

postgres 以下にある libpq.so.2.1 を /lib 以下にシンボリックリンクを貼ります。

# ln -s /usr/local/pgsql/lib/libpq.so.2.1 /lib/libpq.so.2.1

ちゃんと libpq.so.2.1 が読み込めていることを確認できました。

# ldd /etc/httpd/modules/libphp4.so
	libpam.so.0 => /lib/libpam.so.0 (0x40177000)
	libdl.so.2 => /lib/libdl.so.2 (0x40180000)
	libpq.so.2.1 => /lib/libpq.so.2.1 (0x40184000)
	libcrypt.so.1 => /lib/libcrypt.so.1 (0x40196000)
	libresolv.so.2 => /lib/libresolv.so.2 (0x401c4000)
	libm.so.6 => /lib/libm.so.6 (0x401d6000)
	libnsl.so.1 => /lib/libnsl.so.1 (0x401f8000)
	libc.so.6 => /lib/libc.so.6 (0x4020f000)
	/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
# vi /etc/httpd/conf/httpd.conf
#LoadModule php4_module        lib/apache/libphp4.so
LoadModule php4_module        /usr/lib/apache/libphp4.so

[参考]:2日目突入ちぅ – やちまうの戯言

[PHP4] make[1]: *** [libphp4.la] エラー 1

PHP4 をソースコードから再インストールする際に、make でエラーが出たので解決方法をメモ。

一度、make install してから、./configure のオプションを変更して、再インストールしたい。

# ./configure
# make
# make install
# ./configure
# make
...
stub.lo: file not recognized: File truncated
collect2: ld returned 1 exit status
make[1]: *** [libphp4.la] エラー 1
make[1]: 出ます ディレクトリ `/usr/local/src/php-4.0.6'
make: *** [all-recursive] エラー 1

上記のようなエラーが出た場合、make clean すればOK

# make clean
# make
# make install

[PHP] Excel_Reviser の使い方

PHPでExcelを操作できるライブラリ「Excel_Reviser」の使うために参考になったサイトをメモ。

Excel_Reviser は PHP4 でも使えるのです。レガシー!

Excel_Reviser

茶漬けフォーラム • ログイン

セルの書式設定

[PHP][APC] Warning: require_once(): Unable to allocate memory for pool.

PHP にて「Warning: require_once(): Unable to allocate memory for pool.」とエラーログに出力されているのを見つけました。

APCのバグらしい。

PHP :: Bug #58982 :: apc produces tons of warnings “Unable to allocate memory for pool.”

/etc/php.d/apc.ini の設定を変更して対応しました。

apc.mmap_file_mask=/tmp/apc.XXXXX

↓(変更)

apc.mmap_file_mask=/dev/zero

apc.mmap_file_mask string

–enable-mmap を用いて MMAP サポートつきでコンパイルされている場合、ここで mktemp 形式のファイルマスクを指定します。mmap モジュールは、 mmap されたメモリ領域をファイルに置くか共有メモリに置くかを、 これによって判断します。 ファイルベースの mmap を使用するには、この値を /tmp/apc.XXXXXX (正確に 6 つの X)のように指定します。 POSIX 形式の shm_open/mmap を使用するには、.shm をマスクのどこかで指定します。例: /apc.shm.XXXXXX 。 また、/dev/zero を指定することで、カーネルの /dev/zero インターフェイスを使用した anonymous mmap を使用することもできます。未定義の場合は、この方式が用いられます。

[引用元]:PHP: 実行時設定 – Manual

[PHP] 機種依存文字の文字コード変換(EUC-JP→UTF-8)

PHP で、EUC-JP から UTF-8 への機種依存文字の文字コード変換する方法をメモ。

mb_convert_encoding(mb_convert_encoding($value,"sjis-win","EUC-JP"),"UTF-8","sjis-win")

EUC-JP から sjis-win へ変換後、sjis-win から UTF-8 へ変換することで、機種依存文字も含めて正常に文字コード変換できるみたいです。


参考情報

PHPで、いわゆる機種依存文字の文字コード変換(EUC-JP→UTF-8)にはまる - エンジニアが作る最新ITブログ by DODA

PHP の mbstring に関するメモ

[PHP] Excel 出力時の同一セル内改行させる方法

PHPでExcelのセルに、改行を含んだ文字列をセットしたい場合は PHP_EOL を使います。

$cell = '改行前' . PHP_EOL . '改行後';

参考情報

Excel出力時の同一セル改行 – Webエンジニアの技術メモ ~PHP、SQL、Linuxなど~

いまさらながらPHP_EOL定数と改行コードについて | 深追い Fukaoi.org