本文目录一览:
- 1、如何用supervisor守护php-fpm主进程以实现php-fpm的自动重启
- 2、如何“妥善的” 杀死用 php 开启的进程
- 3、如何在PHP里启动一个进程以后让它在后台运行
- 4、如何禁止某些进程开机自启
- 5、PHP服务器 自动隐藏启动
- 6、启动php-fpm为什么有启动了多个进程
如何用supervisor守护php-fpm主进程以实现php-fpm的自动重启
1. 安装supervisor
supervisor本身是python实现的,而且是调研阶段,故先创建一个新的virtualenv环境,然后用pip安装好supervisor包。
至此,基本的调研环境搭建完毕。当然,php-fpm和PHP环境以及前端的Nginx是早就ready的。
2. 分析php-fpm.sh脚本
通常编译安装PHP后,php-fpm这个2进制的C程序也会被编译并安装好,典型路径在php_install_path/sbin/目录下。该
目录下还有个名为php-fpm.sh的脚本用于控制php-fpm进程的start/stop/restart/reload等动作。
./sbin/php-fpm.sh脚本中,”start”操作启动了php-fpm主进程,其余的操作都是通过向php-fpm master进程发signal实现的。
code class="hljs bash"## code segment in php-fpm.sh
case "$1" in
start)
echo -n "Starting php-fpm "
## 下面这行是关键命令
$php_fpm_BIN --daemonize $php_opts
if [ "$?" != 0 ] ; then
echo " failed"
exit 1
fi
wait_for_pid created $php_fpm_PID
if [ -n "$try" ] ; then
echo " failed"
exit 1
else
echo " done"
fi
;;/code
从上面是终端输入”./sbin/php-fpm.sh
start”时,实际执行的代码,可以看到,php-fpm进程的启动参数是–daemonize
$php_opts,而$php_opts的值为”–fpm-config $php_fpm_CONF –pid $php_fpm_PID”。
注意: php-fpm.sh启动php-fpm master进程时,传入了daemonize参数,表明php-fpm master process以守护(daemon)方式启动,而根据supervisor文档的说明,当用supervisor监护进程时,被监护进程不能是守护进程,这是由于守护进程通常会在fork完子进程后就让父进程”结束生命”,也即由supervisor创建的父进程退出,此时,supervisor无法再监护已退出进程创建出来的子进程。关于daemon process的行为,可以参考Linux Daemon Writing HOWTO一文来理解。
根据上面的分析,我们知道,只要supervisor启动php-fpm进程时,不传入daemonize参数即可。
3. 实现php-fpm主进程守护功能的supervisor配置文件
上面的分析已经告诉我们应该怎么解决问题了,下面直接上验证可用的配置文件。文件位于php-fpm.conf同级目录下(典型路径为php_install_path/etc/)。
code class="hljs bash"code class="hljs vhdl"
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9015 ; (ip_address:port specifier, *:port for all iface)
[supervisord]
logfile=./var/log/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=2 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=./var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
identifier=sup.php-fpm ; (supervisord identifier, default is 'supervisor')
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl= ; use an http:// url to specify an inet socket
[program:php-fpm]
command=bash -c "sleep 1 /home/slvher/tools/php/5.6.11/sbin/php-fpm --fpm-config /home/slvher/tools/php/5.6.11/etc/php-fpm.conf --pid /home/slvher/tools/php/5.6.11/var/run/php-fpm.pid" ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; whether/when to restart (default: unexpected)
startretries=5 ; max # of serial start failures (default 3)
exitcodes=0,2,70 ; 'expected' exit codes for process (default 0,2)
stopsignal=QUIT ; signal used to kill process (default TERM)
stopwaitsecs=2 ; max num secs to wait b4 SIGKILL (default 10)
/code/code
配置文件结构通过查看supervisor文档很容易就能掌握,有两个配置项需要特别注意:
1) command
它指定了supervisor要监控的进程的启动命令,可以看到,这里我们没有给php-fpm传入daemonize参数,其余参数只是展开了php-fpm.sh中的shell变量而已。
大家已经注意到,command也不是直接调起php-fpm,而是通过bash -c执行了两个命令,而第一个命令是sleep 1。这是由于php-fpm在stop后,其占用的端口通常不能立即释放,此时,supervisor以极快的速度试图重新拉起进程时,可能会由于报如下错误而导致几次retry均失败:
code class="hljs bash"code class="hljs vhdl"code class="hljs vbscript"## var/log/php-fpm.error.log
[18-Jul-2015 21:35:28] ERROR: unable to bind listening socket for address '127.0.0.1:9002': Address already in use (98)
[18-Jul-2015 21:35:28] ERROR: FPM initialization failed/code/code/code
而supervisor目前还不支持delay restart功能,因此,这里只能通过先sleep再启动的略显tricky的方法来解决问题,结果表明,疗效不错且无副作用。-_-
2) autorestart
其文档描述如下:
code class="hljs bash"code class="hljs vhdl"code class="hljs vbscript"code class="hljs livecodeserver"May be one of false, unexpected, or true. If false, the process will never be autorestarted. If unexpected, the process will be restart when the program exits with an exit code that is not one of the exit codes associated with this process’ configuration (see exitcodes). If true, the process will be unconditionally restarted when it exits, without regard to its exit code./code/code/code/code
其默认值是unexpected,表示若被监护进程的exit code异常时,supervisor才会重新拉起进程。这里设置为true,表明任何时候进程退出均会被再次拉起。
这样配置好后,在本文第1步搭建好的virtualenv环境中,运行如下命令即可完成supervisor对php-fpm master进程的监护:
code class="hljs bash"code class="hljs vhdl"code class="hljs vbscript"code class="hljs livecodeserver"code class="hljs avrasm"shell supervisord -c etc/sup.php-fpm.conf/code/code/code/code/code
然后,通过ps x | fgrep fpm可以看到,php-fpm主进程已经被拉起了。
然后,kill掉php-fpm主进程,再次ps x | fgrep fpm可以看到,一个新的php-fpm主进程会被supervisor创建出来。
至此,用supervisor守护php-fpm主进程以实现php-fpm的自动重启的需求已经解决了。
如何“妥善的” 杀死用 php 开启的进程
apache开启时会自动加载php到进程中(需要设置php5_module),并加载了core, zendengine, extesion 3个模块。 core是核心,处理各种请求,stream模式 zendengine是解释器,用来执行用户代码 extension则是php的插件,比较常用的类似于mysqli
如何在PHP里启动一个进程以后让它在后台运行
在LINUX/UNIX下:
符号""表示把程序放在后台运行,而调用者继续。
WIN9X/NT下,要用start命令:
WINNT的start命令比WIN9X的多很多选项。
如何禁止某些进程开机自启
运行msconfig,在里面可以设置。或用360、超级兔子等优化工具。再给你发个批处理,自动清除多余的启动项目。
PHP服务器 自动隐藏启动
其实apache 安装,就只需安装一个服务,即可(当然配置文件中有点改动),下边是我使用的apache,我是安装后,直接拷文件出来,然后卸载,以后就可以用这些文件一键安装咯(当然安装目录)是固定的,但没有图标什么的,一键安装,一键卸载。批处理内容如下:
@echo off
color 1f
sc delete http_skcg
D:\web\apache2.2\bin\httpd -k install -n "http_skcg" -f "D:\web\apache2.2\conf\http_skcg.conf"
net start http_skcg
pause
上述内容另存为bat或cmd格式
启动php-fpm为什么有启动了多个进程
php-fpm的两种进程管理模式 php-fpm的进程数也是可以根据设置分为动态和静态的。 一种是直接开启指定数量的php-fpm进程,不再增加或者减少; 另一种则是开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加php-fpm进程数到上限,当空闲的时候自动释放空闲的进程数到一个下限。 这两种不同的执行方式,可以根据服务器的实际需求来进行调整。 这里先说一下涉及到这个的几个参数吧,他们分别是pm、pm.max_children、pm.start_servers、pm.min_spare_servers和pm.max_spare_servers。 pm表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。 在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件给出的说明了。PHP5.3 php-fpm的默认静态处理方式会使得php-cgi的进程长期占用内存而无法释放,这也是导致nginx出错的原因之 一,因此可以将php-fpm的处理方式改成apache模式。 下面4个参数的意思分别为:pm.max_children:静态方式下开启的php-fpm进程数量。pm.start_servers:动态方式下的起始php-fpm进程数量。pm.min_spare_servers:动态方式下的最小php-fpm进程数量。pm.max_spare_servers:动态方式下的最大php-fpm进程数量。 如果dm设置为static,那么其实只有pm.max_children这个参数生效。系统会开启设置的数量个php-fpm进程。如果dm设置为dynamic,那么pm.max_children参数失效,后面3个参数生效。系统会在php-fpm运行开始的时候启动 pm.start_servers个php-fpm进程,然后根据系统的需求动态在pm.min_spare_servers和 pm.max_spare_servers之间调整php-fpm进程数。那么,对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,我们运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。所以,动态方式因为会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或者VPS上使用。具体最大数量根据 内存/20M 得到。比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比较合适的值在5~10之间。然后对于比较大内存的服务器来说,设置为静态的话会提高效率。因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据内存/30M 得到。比如说2GB内存的服务器,可以设置为50;4GB内存可以设置为100等。