由于公司开发部的需要,现在需要使用php-5.4.17,按照惯例下载、安装、配置。但是在配置好了之后,多次重启php-fpm,发现php-fpm.log里有很多下面的错误信息:

[24-Aug-2013 04:29:05] ERROR: unable to read what child say: Bad file descriptor (9)
[24-Aug-2013 04:29:05] ERROR: unable to read what child say: Bad file descriptor (9)
[24-Aug-2013 04:29:05] ERROR: unable to read what child say: Bad file descriptor (9)
[24-Aug-2013 04:29:05] ERROR: unable to read what child say: Bad file descriptor (9)
[24-Aug-2013 04:29:05] ERROR: unable to read what child say: Bad file descriptor (9)

真是奇怪了,配置也没有什么特别的,都和老版本一样啊!

配置文件内容如下:

[global]
pid = run/php-fpm.pid
error_log = log/php-fpm.log
log_level = notice
daemonize = yes
rlimit_files = 65536
[www]
user = daemon
group = daemon
listen = 127.0.0.1:9000
listen.allowed_clients = 127.0.0.1
pm = static
pm.max_children = 128
pm.max_requests = 500
pm.status_path = /status
ping.path = /ping
ping.response = pong
slowlog = var/log/$pool.log.slow
request_slowlog_timeout = 2s
request_terminate_timeout = 15s
rlimit_files = 65536
catch_workers_output = yes
php_flag[display_errors] = on

后来发现是catch_workers_output = yes造成的,把yes改成no就好了,不报错了。

但是这个功能正是需要的,所以我想这应该是php-5.4.17的一个bug,最后不用这个版本了,用了php-5.3.27。

编译安装方法同php-5.4.17相同,反复重启还是出现和php-5.4.17相同的错误,真是见鬼了。

开始google吧,最后发现问题了,的确是个bug。

bug地址:https://bugs.php.net/bug.php?id=65398&edit=3

可以看到存在这个bug的版本有3个,分别是:5.3.27, 5.4.17, 5.5.1。

解决方法也就有了,bug页下面提供了一个补丁,打上补丁就ok了,具体操作如下:

下载补丁文件:

wget -O fpm-race-condition.patch 'https://bugs.php.net/patch-display.php?bug_id=65398&patch=fpm-race-condition.patch&revision=1375772074&download=1'

打补丁:

patch -d php-5.3.27 -p0 < fpm-race-condition.patch

重新编译、安装。这次把catch_workers_output = yes开启,再次反复重启不再出现那个错误了。

ok,问题解决!