❶ 搭建php平台时,为什么老出现下面这个错误呢php-cgi.exe - FastCGI 进程意外退出
可以使用phpstudy或phpstudy for iis支持iis7,iis8和iis6,php版本也可以一键切换。纯中文绿色解压即可,你试试
❷ php-fpm子进程会自动重启吗
服务器出现异常,网站不能正常访问。经排查�php的问题。
在重启php-fpm时,恢复正常。1分钟之后又出现故障。查看php日志文件/usr/local/php/var/log 后提示
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
子进程数已经达到设置的最大值。
要设置php进程数量。需要在php-fpm.conf文件中修改。
先看/usr/local/php/etc/php-fpm.conf文件各项配置解析
pid = run/php-fpm.pid
#pid设置,默认在安装目录中的var/run/php-fpm.pid,建议开启
error_log = log/php-fpm.log
#错误日志,默认在安装目录中的var/log/php-fpm.log
log_level = notice
#错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
emergency_restart_threshold = 60
emergency_restart_interval = 60s
#表示在emergency_restart_interval所设值内出现SIGSEGV或者SIGBUS错误的php-cgi进程数如果超过 emergency_restart_threshold个,php-fpm就会优雅重启。这两个选项一般保持默认值。
process_control_timeout = 0
#设置子进程接受主进程复用信号的超时时间. 可用单位: s(秒), m(分), h(小时), 或者 d(天) 默认单位: s(秒). 默认值: 0.
daemonize = yes
#后台执行fpm,默认值为yes,如果为了调试可以改为no。在FPM中,可以使用不同的设置来运行多个进程池。 这些设置可以针对每个进程池单独设置。
listen = 127.0.0.1:9000
#fpm监听端口,即nginx中php处理的地址,一般默认值即可。可用格式为: ‘ip:port’, ‘port’, ‘/path/to/unix/socket’. 每个进程池都需要设置.
listen.backlog = -1
#backlog数,-1表示无限制,由操作系统决定,此行注释掉就行。backlog含义参考:
http://www.3gyou.cc/?p=41
listen.allowed_clients = 127.0.0.1
#允许访问FastCGI进程的IP,设置any为不限制IP,如果要设置其他主机的nginx也能访问这台FPM进程,listen处要设置成本地可被访问的IP。默认值是any。每个地址是用逗号分隔. 如果没有设置或者为空,则允许任何服务器请求连接
listen.owner = www
listen.group = www
listen.mode = 0666
#unix socket设置选项,如果使用tcp方式访问,这里注释即可。
user = www
group = www
#启动进程的帐户和组
pm = dynamic #对于专用服务器,pm可以设置为static。
#如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。如果选择dynamic,则由下开参数决定:
pm.max_children #,子进程最大数
pm.start_servers #,启动时的进程数
pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程
pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理
pm.max_requests = 1000
#设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ’0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0.
pm.status_path = /status
#FPM状态页面的网址. 如果没有设置, 则无法访问状态页面. 默认值: none. munin监控会使用到
ping.path = /ping
#FPM监控页面的ping网址. 如果没有设置, 则无法访问ping页面. 该页面用于外部检测FPM是否存活并且可以响应请求. 请注意必须以斜线开头 (/)。
ping.response = pong
#用于定义ping请求的返回相应. 返回为 HTTP 200 的 text/plain 格式文本. 默认值: pong.
request_terminate_timeout = 0
#设置单个请求的超时中止时间. 该选项可能会对php.ini设置中的’max_execution_time’因为某些特殊原因没有中止运行的脚本有用. 设置为 ’0′ 表示 ‘Off’.当经常出现502错误时可以尝试更改此选项。
request_slowlog_timeout = 10s
#当一个请求该设置的超时时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中. 设置为 ’0′ 表示 ‘Off’
slowlog = log/$pool.log.slow
#慢请求的记录日志,配合request_slowlog_timeout使用
rlimit_files = 1024
#设置文件打开描述符的rlimit限制. 默认值: 系统定义值默认可打开句柄是1024,可使用 ulimit -n查看,ulimit -n 2048修改。
rlimit_core = 0
#设置核心rlimit最大限制值. 可用值: ‘unlimited’ 、0或者正整数. 默认值: 系统定义值.
chroot =
#启动时的Chroot目录. 所定义的目录需要是绝对路径. 如果没有设置, 则chroot不被使用.
chdir =
#设置启动目录,启动时会自动Chdir到该目录. 所定义的目录需要是绝对路径. 默认值: 当前目录,或者/目录(chroot时)
catch_workers_output = yes
#重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null . 默认值: 空.
根据以上配置的解析,在php-fpm.conf文件中添加如下配置:
pm.max_children = 100
pm.start_servers = 30
pm.min_spare_servers = 20
pm.max_spare_servers = 100
以观后效。
另附豆瓣技术贴:https://www.douban.com/note/315222037/
1、php-fpm优化参数介绍
他们分别是:pm、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers。
pm:表示使用那种方式,有两个值可以选择,就是static(静态)或者dynamic(动态)。
在更老一些的版本中,dynamic被称作apache-like。这个要注意看配置文件的说明。
下面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进程数
2、服务器具体配置
对于我们的服务器,选择哪种执行方式比较好呢?事实上,跟Apache一样,运行的PHP程序在执行完成后,或多或少会有内存泄露的问题。
这也是为什么开始的时候一个php-fpm进程只占用3M左右内存,运行一段时间后就会上升到20-30M的原因了。
对于内存大的服务器(比如8G以上)来说,指定静态的max_children实际上更为妥当,因为这样不需要进行额外的进程数目控制,会提高效率。
因为频繁开关php-fpm进程也会有时滞,所以内存够大的情况下开静态效果会更好。数量也可以根据 内存/30M 得到,比如8GB内存可以设置为100,
那么php-fpm耗费的内存就能控制在 2G-3G的样子。如果内存稍微小点,比如1G,那么指定静态的进程数量更加有利于服务器的稳定。
这样可以保证php-fpm只获取够用的内存,将不多的内存分配给其他应用去使用,会使系统的运行更加畅通。
对于小内存的服务器来说,比如256M内存的VPS,即使按照一个20M的内存量来算,10个php-cgi进程就将耗掉200M内存,那系统的崩溃就应该很正常了。
因此应该尽量地控制php-fpm进程的数量,大体明确其他应用占用的内存后,给它指定一个静态的小数量,会让系统更加平稳一些。或者使用动态方式,
因为动态方式会结束掉多余的进程,可以回收释放一些内存,所以推荐在内存较少的服务器或VPS上使用。具体最大数量根据 内存/20M 得到。
比如说512M的VPS,建议pm.max_spare_servers设置为20。至于pm.min_spare_servers,则建议根据服务器的负载情况来设置,比如服务器上只是部署php环境的话,比较合适的值在5~10之间。
本服务器配置
1、服务器基本信息:
硬盘:数据盘30G、系统盘20G
内存:1.5G
CPU:双核
系统:CentOS 6.3 64位
带宽:独享2M
2、部署的应用
Git、SVN、Apache、Tomcat、PHP、Nginx、mysql、JDK
3、优化后的参数
pm = dynamic
pm.start_servers = 5
pm.min_spare_servers = 2
pm.max_spare_servers = 8
❸ 为什么PHP程序报"Internal Server Error"错误
如果您上传的php程序在运行后报“internal server error”错误,请您注意检查以下两方面:
1、请您检查php程序的属性是否设置为755,如果php程序的属性不是755,那么运行的时候会报“internal server error”错误,请您使用ftp软件将属性更改为755再测试。
2、请您检查php程序所在的当前目录下是否有名为.htaccess的文件存在,此文件会干扰php程序的正常运行,如果发现有此文件建议您删除或者改名后再测试。
❹ 如何防止PHP进程异常退出
通常,在cli下运行的常驻后台PHP进程,可能异常退出,比如php执行过程中出现的致命错误,或被 kill 命令手动杀死等。如下面的php代码:
while(1){
$content = fgets(STDIN);
if(empty($content)){
sleep(1);
}
//逻辑处理部分代码省略
}
排查过程
我们使用register_shutdown_function来跟踪下到底是什么错误导致的进程退出。(想更多了解register_shutdown_function,请查看博文 妙用php中的register_shutdown_function和fastcgi_finish_request )加入了错误捕捉代码。如下:
$is_end = false;
function catch_error(){
global $is_end;
$time = date('Y-m-d H:i:s');
$error = error_get_last();
$msg = "$time [error]";
if($is_end){
$msg .= "is_end[yes]";
}else{
$msg .= "is_end[no]";
}
if($error){
$msg .= var_export($error,1);
}
echo $msg."\r\n";
}
register_shutdown_function("catch_error");
可是,php进程再次退出。而在日志中并没有记录任何信息。说明register_shutdown_function方法根本没有执行。是什么导致register_shutdown_function方法没有运行呢?在php的官方文档中又这样一个注释:
Shutdown functions will not be executed if the process is killed with a SIGTERM or SIGKILL signal. While you cannot intercept a SIGKILL, you can use pcntl_signal() to install a handler for a SIGTERM which uses exit() to end cleanly.
注释的意思是当php进程获得SIGTERM和SIGKILL信号而退出时,是不执行register_shutdown_function方法的。可以使用pcntl_signal()方法来捕获信息,并调用相应的处理方法。
好,那是不是信号导致我们的php进程退出呢?我们加入如下代码:
declare(ticks = 1);
function sig_handler($signo){
$time = date('Y-m-d H:i:s');
echo $time." exit signo[{$signo}]\r\n";
exit("");
}
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
pcntl_signal(SIGQUIT, "sig_handler");
pcntl_signal(SIGILL, "sig_handler");
pcntl_signal(SIGPIPE, "sig_handler");
pcntl_signal(SIGALRM, "sig_handler");
过一段时间,发现php进程退出了,日志中出现了如下日志信息:
2014-11-23 18:30:06 exit signo[14]
2014-11-23 18:30:06 [error]is_end[no]
看来是sigalarm信号导致php进程退出了。这个信号是可以捕获和处理的。这样无关紧要的信号,我们还是忽略吧。最终的代码如下:
declare(ticks = 1);
$is_end = false;
function catch_error(){
global $is_end;
$time = date('Y-m-d H:i:s');
$error = error_get_last();
$msg = "$time [error]";
if($is_end){
$msg .= "is_end[yes]";
}else{
$msg .= "is_end[no]";
}
if($error){
$msg .= var_export($error,1);
}
echo $msg."\r\n";
}
register_shutdown_function("catch_error");
function sig_handler($signo){
$time = date('Y-m-d H:i:s');
if($signo == 14){
//忽略alarm信号
echo $time." ignore alarm signo[{$signo}]\r\n";
}else{
echo $time." exit signo[{$signo}]\r\n";
exit("");
}
}
pcntl_signal(SIGTERM, "sig_handler");
pcntl_signal(SIGHUP, "sig_handler");
pcntl_signal(SIGINT, "sig_handler");
pcntl_signal(SIGQUIT, "sig_handler");
pcntl_signal(SIGILL, "sig_handler");
pcntl_signal(SIGPIPE, "sig_handler");
pcntl_signal(SIGALRM, "sig_handler");
while(1){
$content = fgets(STDIN);
if(empty($content)){
sleep(1);
}
//逻辑处理部分代码省略
}
$is_end = true;
经过一段观察,在日志中又发现了alarm相关的日志,但是php进程依然在。看来我们的修改有作用了。
❺ grpc导致php子进程不能退出0
因为使用会员中心插件,会员中心类插件会接管grpc系统的登录页面,从而导致grpc导致php子进程不能退出0。grpc是google开源的一个高性能,跨语言的RPC框架,基于HTTP2协议,基于protobuf3.x支持多种开发语言。
❻ php的多进程是不是可以无限制的fork子进程
对于php了解的不多,但是php作为一种开源脚本语言,其中有C、Java、Perl编程语言的特点。
就C而言,无限制的fork子进程显然是不可能的。进程是并发程序在执行过程中分配和管理资源的基本单位,是一个动态的概念。如果为每一个请求都创建一个进程的话,系统的开销会很大,而且用户请求效率非常低。
另一方面,进程之间是独立的地址空间,并且进程之间的资源都是独立的,这不像同一进程内的线程共享本进程的资源。所以说在有限的存储空间中无限制的fork子进程显然是很难实现的。
个人见解,如有误或者您有更好的见解,敬请指教!
❼ php-cgi.exe应用程序错误 "0x00000000"指令引用的"0x00000000"内存.该内存不能为"read";
电脑出现:【该内存不能为read】,这是你安装的“软件”和电脑中的“内存”有冲突!
1。电脑里有【木马或病毒】干扰,下载“360安全卫士”和“360杀毒双引擎版”或“金山卫士”和“金山毒霸”,建议“全盘扫描”病毒和木马,修补电脑上的“高危”和“重要”的【系统漏洞】!【系统修复】,一键修复!【插件清理】,立即清理【恶评插件】!
2。【可疑启动项】,下载“360系统急救箱”,或打开360安全卫士,【功能大全】里的“360系统急救箱”,开始急救,完毕后,重启电脑!开机后,【文件恢复区】,点开:可疑启动项和木马,彻底删除文件!
再:【系统修复】,全选,立即修复!【网络修复】,开始修复。重启电脑!
【金山急救箱】,勾选【扩展扫描】,立即扫描,完毕后,立即处理,重启电脑!
3。你下载的“播放器”,或“聊天软件”,或“IE浏览器”,或“游戏”的【程序不稳定】,或者“版本太旧”!建议卸掉,下载新的,或将其升级为【最新版本】!IE浏览器,和测试版软件不推荐升级!
4。就是你安装了两款或两款以上的同类软件(如:两款播放器,两款qq,或多款浏览器,多款杀毒软件,多款网游等等)!它们在一起【互不兼容】,卸掉“多余”的那一款!
5。你在电脑左下角“开始”菜单里找到【强力卸载电脑上的软件】,找到多余的那款卸掉! 卸完了再“强力清扫”(看准了再卸,别把有用的卸了)!完毕后,重启电脑!
6。再不行,开始菜单,运行 ,输入cmd, 回车,在命令提示符下输入【复制即可】 :
for %1 in (%windir%\system32\*.ocx) do regsvr32 /s %1
粘贴,回车,完毕后,再输入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
回车!直到屏幕滚动停止为止,重启电脑!
7。再不行,去网上下载一个【read修复工具】,修复一下试试!注意查杀一下病毒和木马!
8。重启电脑,开机出完电脑品牌后,按“F8”,进到“安全模式”,光标选定:【最后一次正确设置】,回车,回车,看看效果如何!
实在不行就:【一键还原系统或重装系统】!
❽ 本人小白请教PHP程序不能正常运行问题报错如下求解
可能是相应文件夹没有写权限
❾ php.exe应用程序错误如何解决
你好!电脑出现:【该内存不能为read与written】,原因是比较复杂的,请对症下药!
【答案原创,引用请说明,原作者:力王历史】!偶然出现!点:【确定或取消】,即可!
1。配置错误!【重启,出完电脑品牌后,按F8,安全模式,最后一次正确配置,回车,回车】!
2。系统漏洞!【360安全卫士或金山卫士,或可牛免费杀毒,修复:高危和重要的,其它忽略】!
3。软件冲突!【卸载不常用的软件,保持系统稳定,尤其是同类型的软件,不兼容】!
4。软件版本过旧!【使用:(驱动人生),更新:显卡驱动,声卡驱动!其它软件,覆盖安装】!
5。病毒木马!【杀毒软件,全盘扫描与自定义扫描,完毕后,隔离区,彻底删除】!
6。恶评插件!【可牛免费杀毒,金山卫士,或360安全卫士,清理恶评插件】!
7。可疑启动项!【360系统急救箱,开始急救,文件恢复区,彻底删除文件】!
8。系统文件损坏!【金山急救箱】,扩展扫描,立即扫描,立即处理,重启电脑】!
9。专业工具!【去网上下载一个:read修复工具,修复,试试】!
10。指令修复法!开始菜单,运行 ,输入cmd, 回车,在命令提示符下输入(复制即可) :
for %1 in (%windir%\system32\*.ocx) do regsvr32 /s %1
粘贴,回车,滚动完毕后,再输入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1
回车!直到屏幕滚动停止为止,重启电脑!
❿ php进程死锁造成的原因有哪些
产生死锁的原因:一是系统提供的资源数量有限,不能满足每个进程的使用;二是多道程序运行时,进程推进顺序不合理。
产生死锁的必要条件是:1、互斥条件;2、不可剥夺条件(不可抢占);3、部分分配;4、循环等待。
根据产生死锁的四个必要条件,只要使其中之一不能成立,死锁就不会出现。为此,可以采取下列三种预防措施:
1、采用资源静态分配策略,破坏"部分分配"条件;
2、允许进程剥夺使用其他进程占有的资源,从而破坏"不可剥夺"条件;
3、采用资源有序分配法,破坏"环路"条件。
死锁的避免不严格地限制死锁的必要条件的存在,而是系统在系统运行过程中小心地避免死锁的最终发生。最着名的死锁避免算法是银行家算法。死锁避免算法需要很大的系统开销。
解决死锁的另一条途径是死锁检测方法,这种方法对资源的分配不加限制,即允许死锁的发生。但系统定时地运行一个"死锁检测"程序,判断系统是否已发生死锁,若检测到死锁发生则设法加以解除。
解除死锁常常采用下面两种方法:1、资源剥夺法;2、撤消进程法