所以我找到了很少 其他有关此类问题的线索,但他们的解决方案对我来说不起作用。
基本上,这是我的开发机器,并且设置已经正常运行了好几个星期,但是突然间我遇到了很多问题,这些错误:
[Thu Sep 27 16:28:43 2012] [error] [client 127.0.0.1] FastCGI: comm with server "/Library/WebServer/Documents/php5.external" aborted: idle timeout (60 sec)
[Thu Sep 27 16:28:43 2012] [error] [client 127.0.0.1] FastCGI: incomplete headers (0 bytes) received from server "/Library/WebServer/Documents/php5.external"
我没有更改任何与服务器配置相关的内容。显然一定有什么地方发生了变化,或者我只是运气不好。
设置如下:
Apache/2.2.22 (Unix) DAV/2 mod_fastcgi/2.4.6 mod_ssl/2.2.22 OpenSSL/0.9.8r
$ php-fpm -v
PHP 5.3.15 (fpm-fcgi) (built: Aug 19 2012 09:06:12)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Xdebug v2.2.1, Copyright (c) 2002-2012, by Derick Rethans
$ sudo lsof -i TCP:9000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php-fpm 97167 _www 6u IPv4 0xd65451f140772337 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 97174 _www 0u IPv4 0xd65451f140772337 0t0 TCP localhost:cslistener (LISTEN)
php-fpm 97174 _www 3u IPv4 0xd65451f14739c337 0t0 TCP localhost:cslistener->localhost:54750 (CLOSE_WAIT)
$ tail -16 /etc/apache2/httpd.conf
<IfModule mod_fastcgi.c>
FastCGIExternalServer /Library/WebServer/Documents/php5.external -flush -host 127.0.0.1:9000 -idle-timeout 60
AddHandler php5-fcgi .php
Action php5-fcgi /usr/lib/cgi-bin/php5.external
Alias /usr/lib/cgi-bin/ /Library/WebServer/Documents/
<Directory /usr/local/sbin>
Options ExecCGI FollowSymLinks
SetHandler fastcgi-script
Order allow,deny
Allow from all
AllowOverride All
</Directory>
</IfModule>
它几乎是默认的 php-fpm.conf,但日志位置已更改,按需进程管理器、pm.max_children = 1 以及其他所有内容均为默认设置。
我尝试过几十次重新启动 apache,并以不同的顺序终止所有 php-fpm 进程。
任何建议都会受到热烈鼓励、欢迎、赞赏、尝试和希望。
更新时间:2012 年 9 月 28 日
好吧,我用了这教程并尝试使用套接字方法来查看是否是 TCP 端口冲突 - 结果发现不是。使用套接字也无助于解决每 10 秒出现一次的错误消息,如下所示:
对于 TCP:
[28-Sep-2012 08:44:58] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (48)
[28-Sep-2012 08:44:58] ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (48)
[28-Sep-2012 08:44:58] ERROR: FPM initialization failed
[28-Sep-2012 08:44:58] ERROR: FPM initialization failed
对于套接字:
[28-Sep-2012 08:48:32] ERROR: An another FPM instance seems to already listen on /tmp/php5-fpm.sock
[28-Sep-2012 08:48:32] ERROR: An another FPM instance seems to already listen on /tmp/php5-fpm.sock
[28-Sep-2012 08:48:32] ERROR: FPM initialization failed
[28-Sep-2012 08:48:32] ERROR: FPM initialization failed
不过,我确实找到了如何解决这个问题的方法,它就在我刚刚链接的教程中。启动代理 plist 配置需要指定 RunOnlyOnce。但不确定这对 TCP 是否安全。
不过我确实取得了一些进展,这可能会使这个问题过于具体。我使用 NetBeans 进行开发,当我尝试使用 xdebug 启动调试会话时,它可以很好地加载 - 很酷 - 但是只要代码需要在断点处暂停,我就会回到原点。comm with server ... aborted: idle timeout
为了满足所有条件,我将 httpd.conf 中的 -idle-timeout 设置为 300。但没用。如果我关闭 Netbeans 并且不尝试(永远)启动调试会话,服务器不会死机,它会按预期运行。
我即将尝试重新启动我的 MacBook,但老实说这不是一个有效的解决方案。
答案1
因此,我认为我最好对此作出回复,因为没有其他人这样做。
我不知道如何阻止 PHP-FPM 在通过 TCP 监听时一遍又一遍地记录绑定错误。
我通过切换到 unix 套接字监听并将启动代理配置为在启动时仅运行一次 PHP-FPM 来解决了我的问题。
这是我所能做的最好的事情。也许这会对某些人有帮助,我不知道。
在php-fpm.conf
listen = /tmp/php5-fpm.sock
在httpd.conf
<IfModule mod_fastcgi.c>
AddHandler php5-fcgi .php
Action php5-fcgi /php5-fcgi
Alias /php5-fcgi /Library/WebServer/CGI-Executables/php-fcgi
FastCGIExternalServer /Library/WebServer/CGI-Executables/php-fcgi -socket /tmp/php5-fpm.sock -pass-header Authorization -idle-timeout 300
<Directory /usr/local/sbin>
Options ExecCGI FollowSymLinks
SetHandler fastcgi-script
Order allow,deny
Allow from all
AllowOverride All
</Directory>
</IfModule>
在/Library/LaunchAgents/homebrew-php.josegonzalez.php53.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>homebrew-php.josegonzalez.php53</string>
<key>LaunchOnlyOnce</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/Cellar/php53/5.3.15/sbin/php-fpm</string>
<string>--fpm-config</string>
<string>/usr/local/etc/php/5.3/php-fpm.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>Username</key>
<string>www</string>
<key>WorkingDirectory</key>
<string>/usr/local/var</string>
<key>StandardErrorPath</key>
<string>/usr/local/Cellar/php53/5.3.15/var/log/php-fpm.log</string>
</dict>
</plist>
答案2
只需在您的项目中执行 l s-lA 并找出您的用户和组。然后编辑php-fpm.conf
php-fpm5.6 和www.conf
php7.* 版本
在我的例子中,我的用户 = vallabh,组 = staff
并更新 listen = 127.0.0.1:9071 和 listen = 127.0.0.1:9056
它非常方便并且易于记住端口。
祝您编码愉快。
使用下面的 shell 代码来验证您是否正在绑定端口。
lsof -Pni4 | grep LISTEN | grep php