创建好了进程,那么怎么对子进程进行管理呢?
使用信号,对子进程的管理,一般有两种情况:(推荐学习:PHP编程从入门到精通)
posix_kill():此函数并不能顾名思义,它通过向子进程发送一个信号来 *** 作子进程,在需要要时可以选择给子进程发送进程终止信号来终止子进程;
pcntl_waitpid():等待或返回fork的子进程状态,如果指定的子进程在此函数调用时已经退出(俗称僵尸进程),此函数将立刻返回,并释放子进程的所有系统资源,此进程可以避免子进程变成僵尸进程,造成系统资源浪费;
孤儿进程:父进程挂了,子进程被pid=1的init进程接管(wait/waitpid),直到子进程自身生命周期结束被系统回收资源和父进程 采取相关的回收 *** 作
僵尸进程:子进程exit退出,父进程没有通过wait/waitpid获取子进程状态,子进程占用的进程号等描述资源符还存在,产生危害:例如进程号是有限的,无法释放进程号导致未来可能无进程号可用
**父进程中使用:pcntl_wait或者pcntl_waitpid的目的就是防止worker成为僵尸进程
作用:使用pcntl_wait()后,在子进程死掉后,父进程也会被停止**
最后我们通过下图来简单的总结和描述这个多进程实现的过程:
a34c883897ee2a99833e0ad1e26c1fd4.png
进程管理-进程间通信
队列:如Redis,推荐
socket:推荐
管道:实现复杂,且管道(pipe),使用文件形式存在,存在硬盘IO性能瓶颈
信号:承载信息量少,不好管理
进程管理-切换为守护进程
使用&实现
php deadloop.php &
相关资源:Nginx使用的php-fpm的两种进程管理方式及优化-其它代码类资源...
打开CSDN APP,看更多技术内容
php 进程管理,PHP 进程管理器 PHP-FPM_阿喵看海外的博客
php-fpm是PHP的一个进程管理器。php下面的众多work进程皆有php-fpm进程管理器管理。 php-fpm的工作原理 php-fpm全名是PHP FastCGI进程管理器。php-fpm启动后会先读php.ini,然后再读相应的conf配置文件,conf配置可以覆盖php.ini的配置。
继续访问
php-fpm解读-进程管理的三种模式_april2nd的博客_php-fpm...
php-fpm进程管理一共有三种模式:ondemand、static、dynamic,我们可以在同一个fpm的master配置三种模式,看下图1。php-fpm的工作模式和nginx类似,都是一个master,多个worker模型。每个worker都在accept本pool内的监听套接字(linux已不存在惊...
继续访问
浅谈PHP进程管理
这篇文章是对之前一篇文章的补充和改进, 创建一个主(master)进程,主进程安装定时器,每隔5分钟检测一次队列长度,根据队列长度计算需要的worker进程, 然后创建或者杀掉子进程。这样做的好处是防止队列堆积,任务得不到及时处理。更新业务代码,只需要reload *** 作即可。 整个流程有以下知识点: 创建守护进程的步骤: 设置默认文件权限 fork一个进程,父进程退出 调用setsid创建一个新的会话 将当前工作目录更改为根目录 关闭不再需要的文件描述符 使用信号实现定时器 上一篇定时器依赖于系统的定时任务,这次使用闹钟信号实现,php 5.3.0以下的版本依赖于ticks,
php 脚本 fpm缓存,PHP生命周期及fpm(FastCGI进程管理器)的运作方式
PHP在web方式中如何改了文件就立即生效的,重要的几个概念:sapi: 可以简单的理解为php引擎对外的一个统一接口,使得php可以和外部程序进行交互php的生命周期中关键四个调用: MINT ->RINT ->RSHUTDOWN ->MSHUTDOWNfpm: fastcgi进程管理器fpm方式的流程就是:fpm通过sapi接口与php进程交互1.fpm启动会调用各扩展...
继续访问
Linux下搭建PHP开发环境,Php-Fpm进程管理。_黑夜开发者的博客
目前PHP项目开发几种比较流行的架构搭建中,LNMP在性能方面是最好的,正因为如此,使得LNMP架构逐渐流行起来,今天,前面提到了Nginx部署,由于项目实际环境的需要,今天就在说一下怎么部署PHP。 环境 ...
继续访问
php而为,为高负载而生的 PHP 进程管理器 —— PHP-PM (PPM)
PHP-PM 可以用于php应用程序的进程管理,增压和负载均衡.它使用 ReactPHP 实现php的事件驱动和非阻塞I/O。 它是基于 ReactPHP,最好是工作在基于请求-响应式的框架,像Symfony的HTTPKernel。这样做是为了减少php启动(包括变量声明,加载和...
继续访问
最新发布 php进程管理
php 进程管理 tasks 过多
继续访问
PHP进程实现&管理
运行环境为Linux,模式为CLI DEMO /*要创建的子进程*/ $manager = [ 'work1', 'work2', 'work3', ]/*当前进程名称*/ $status = file_exists('/proc/' . getmypid() . '/status')$bash = '-'if ($status) { $bash = file('/proc/' . getmypid() . '/status', FILE_IGNORE.
继续访问
php的管理进程管理利器--php-fpm_weixin_33778778的博客
mod_php 模式是将php模块安装到apache中,所以每一次apache结束的请求呢,都会产生一条进程,这个进程就完整的包括php的各种运算计算等 *** 作。 从图中我们很清晰的可以看到,apache每接收一个请求,都会产生一个进程来连接php通过sapi来完成请求...
继续访问
php-frm进程管理,PHP内核探索-进程管理
进程管理方式首先我们了解一下php的三种不同的进程管理方式:static:静态管理进程。在启动时,master按照pm.max_children配置fork出对应数量的work进程,即work的进程是固定不变的。dynamic:动态管理进程。在fpm启动时先按照pm.start_servers初始化一定数量的work进程,运行期间如果master发现空闲work进程低于pm.min_spare_s...
继续访问
理解php-fpm的两种执行方式
前段时间配置php-fpm的时候,无意间发现原来他还有两种执行方式。与Apache一样,他的进程数也是可以根据设置分为动态和静态的。关于Apache的工作方式及对应的设置方法,我已经在《Ubuntu下配置Apache的Worker模式》一文中写出,这里不再多说。 而php-fpm也是同样存在两种方式,一种是直接开启指定数量的php-fpm进程,不再增加或者减少;另一...
继续访问
php进程原理_PHP进程管理器php-fpm的工作原理
PHP进程管理器php-fpm的工作原理发布时间:2020-07-21 17:46:39来源:亿速云阅读:133作者:小新今天小编给大家分享的是PHP进程管理器php-fpm的工作原理,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获的哦。php-fpm是什么php-fpm是PHP的一个进程管理器。php下面的众多work进程皆有php-fpm进程管...
继续访问
如何管理php常驻进程,一看就懂系列之 如何实现与控制php常驻进程-Go语言中文社区...
前言关于如何实现与控制php常驻进程,不管是google还是baidu上进行搜索,都没有感觉看起来赏心悦目的解答,于是决定自己动手总结下。有同学会问了,整这个干甚?简单的说就是,可以让一个php脚本一直处于运行的状态。从而实现将项目中某些耗时 *** 作异步化,进队列后由php脚本取出再执行。有同学又会问了,直接在服务器直接命令“php test.php &”,不就可以实现了?那么这样做的话有三点...
继续访问
PHP-FPM(PHP进程管理器)
PHP-FPM
继续访问
php 进程管理,从 0 到 1 优雅的实现 PHP 多进程管理
_| |_ __ __ _ _ __ _ _| |_ ___| '_ \ / _` | '__| | | | __/ _ \| | | | (_| | | | |_| | || (_) ||_| |_|\__,_|_| \__,_|\__\___/ .TIGERB.cnAn object-oriented multi process manager for PHPVersion: 0...
继续访问
php-fpm进程管理的三种模式
转载自 php-fpm解读-进程管理的三种模式 —程序媛大丽 标明转载以示尊重 感谢原作者的分享。 php-fpm进程管理一共有三种模式:ondemand、static、dynamic,我们可以在同一个fpm的master配置三种模式,看下图1。php-fpm的工作模式和nginx类似,都是一个master,多个worker模型。每个worker都在accept本pool内的监听套接字(linu...
继续访问
php 进程管理那点事
之前本地开发和环境一直用的集成环境,最近新项目 集成了php7+nginx 跑了一段时间发现偶尔 有php进程退出的情况 排查原因 nginx log: 1111 upstream timed out (10060: A connection attempt failed because the connected party did not properly respond after ...
继续访问
从0到1优雅的实现PHP多进程管理
_ | | _ __ __ _ _ __ _ _| |_ ___ | '_ \ / _` | '__| | | | __/ _ \ | | | | (_| | | | |_| | || (_) | |_| |_|\__,_|_| \__,_|\__\___/ ...
继续访问
热门推荐 php-fpm安装、配置与优化
转载自:https://www.zybuluo.com/phper/note/89081 1、php中fastcgi和php-fpm是什么东西 最近在研究和学习php的性能方面的知识,看到了factcgi以及php-fpm,发现我对他们是少之又少的理解,可以说几乎是一无所知,想想还是蛮可怕的。决定仔细的学习一下关于这方面的知识。 参考和学习了以下文章: 1. mod_php和
继续访问
php-fpm的两种进程管理模式
php-fpm的两种进程管理模式 php-fpm的进程数也是可以根据设置分为动态和静态的。 一种是直接开启指定数量的php-fpm进程,不再增加或者减少; 另一种则是开始的时候开启一定数量的php-fpm进程,当请求量变大的时候,动态的增加php-fpm进程数到上限,当空闲的时候自动释放空闲的进程数到一个下限。 这两种不同的执行方式,可以根据服务器的实际需求来进行调整。 这里先说一下涉及
继续访问
7、Php-Fpm进程管理
1、进程管理 php-fpm采用的是master-worker的进程方式。其中, master负责监听端口,等待链接其次,注册信号,可以通过信息好master进行管理 worker负责处理具体的逻辑 如下图所示 2、信号管理 master进程可以理解如下信号 信号 含义 INT, TERM 立刻终止 ...
继续访问
php进程控制
简介 PHP的进程控制支持实现了Unix方式的进程创建, 程序执行, 信号处理以及进程的中断。 进程控制不能被应用在Web服务器环境,当其被用于Web服务环境时可能会带来意外的结果。 这份文档用于阐述每个进程控制函数的通常用法。关于Unix进程控制的更多信息建议您查阅 系统文档中关于fork(2),waitpid(2),signal(2)等的部分或更全面的参考资料比如 《Unix环境高级编程》
继续访问
php进程管理
php 进程管理
1. 开心小闹钟 2.7 Build 0107 SP1
日常生活中常常会遇到由于事务繁忙或要处理的事太多,健忘,无序的事务管理,对个人和单
www.onlinedown.net/soft/9070.htm
2. 极光多能闹钟 5.0
支持电脑自带喇叭响铃和电脑音乐,并可自谱喇叭音乐,享受DIY的乐趣。可以按具体日期
www.onlinedown.net/soft/4451.htm
3. 精致闹钟 2004 V1.40 Build 20040116
修订版V1.40统一界面风格,界面更为清新,添加密码保护
www.skycn.com/soft/9451.html
4. 音乐闹钟 2.00
定时闹响(播放音乐)、定时关机。可播放的音乐文件*.mp3、*.mid、*.midi、*.rmi、*.w
www.onlinedown.net/soft/730.htm
5. 极光多能闹钟 V5.0
支持电脑自带喇叭响铃和电脑音乐,并可自谱喇叭音乐,
www.skycn.com/soft/10136.html
6. 小桂闹钟 V1.93
《小桂闹钟》是一个小巧的桌面闹钟程序,它吸取了众多
www.skycn.com/soft/18402.html
7. 精致闹钟2003 1.40 Build 20040116
精致漂亮、界面超酷的闹钟程序,支持换肤。具有定延时关机、重启、注销,重要事件提醒
www.onlinedown.net/soft/21832.htm
8. 流氓兔子闹钟
流氓兔子闹钟,可爱啊,西西
download.pchome.net/home/calendar/11629.html
9. 小闹钟 1.0
一个界面非常漂亮的小闹钟,可以为您整点报时、定时关机(限win95/98/me)、定时响闹
www.onlinedown.net/soft/8091.htm
10. 开心小闹钟 V2.7 Build 0107 SP1
日常生活中常常会遇到由于事务繁忙或要处理的事太多,健
www.skycn.com/soft/10621.html
11. 小桂闹钟 1.92
《小桂闹钟》是一个小巧的桌面闹钟程序,它除了可以显示当天的时间和日期之外,还可以
www.onlinedown.net/soft/33220.htm
12. 迷你小闹钟 1.0
小巧而且绿色的小闹钟软件
download.pchome.net/home/remind/7178.html
13. 音乐闹钟 2.00
定时闹响(播放音乐)
download.pchome.net/home/remind/7160.html
14. 精致闹钟2004 1.40 Build 20040116
精致漂亮、界面超酷的闹钟程序
download.pchome.net/home/remind/16050.html
15. 桌面小闹钟 1.2
桌面小闹钟,是一个时间管理软件,你可以随时增加、编辑、修改有关定时任务,到时间就d
www.onlinedown.net/soft/28799.htm
16. 超级闹钟 1.0.12.24bata
一款很不错的桌面小闹钟,功能及优点:1、支持定时mp3播放2、显示系统当前时间3、界面
www.onlinedown.net/soft/24273.htm
17. 电子闹钟 1.0
clock.exe用VB写成,要支持文件, myclock.exe用DELPHI写成
download.pchome.net/home/calendar/7530.html
18. 定时闹钟 0.1
本clock定时闹钟为绿色自由软件,功能有两个:一是定时提醒!二是定时关机!绿色软件无需
www.onlinedown.net/soft/24685.htm
19. 悠悠闹钟 V2.60
1、“悠悠闹钟”具有随意设置时间间隔的真人报时、文字
www.skycn.com/soft/24578.html
20. 开心小闹钟 2.6 Build 0824
换肤功能,内置7类皮肤;定时提醒功能
download.pchome.net/home/remind/14140.html
21. 雷达闹钟 V1.01
1、一个功能丰富、介面美观独特的超级酷闹钟。2、定时
www.skycn.com/soft/7419.html
22. 飞羽无痕小闹钟 2.2
语音报时,整点报时,闹钟(40组),定时关机(20组),支持Win9x/NT/2000/XP。本软件为绿
www.onlinedown.net/soft/22644.htm
23. 小小闹钟 1.0
中文界面的时钟提示软件,并具有定时关机和重启动的 功能
download.pchome.net/home/calendar/7511.html
24. 可爱小闹钟 1.0
一个可爱的小闹钟
download.pchome.net/home/remind/13983.html
25. 飞云小闹钟 V1.10
飞云小闹钟是一个功能十足的桌面小闹钟。显示时间:
www.skycn.com/soft/16078.html
26. 闹钟 0.1
可以设定每过多少时间提醒休息一下
download.pchome.net/home/remind/7180.html
27. 迷你小闹钟 1.1
迷你闹钟是一个十分轻巧的桌面时钟,内附有闹铃,你有事可以用它来提醒。提醒你重要的
www.onlinedown.net/soft/18152.htm
28. 迷你小闹钟 V1.1
自定义外形,自定义闹钟颜色,自定义提醒时的声音文件
www.skycn.com/soft/4195.html
29. 小小闹钟 V1.0
一个很实用的定时器。可以定时关机、重启,定时提醒;
www.skycn.com/soft/20174.html
30. 飞云小闹钟 1.10
飞云小闹钟是一个功能十足的桌面小闹钟。显示时间:"飞云小闹钟"可以以指针
www.onlinedown.net/soft/26410.htm
31. 精致闹钟2003(简装版) 1.40 Build 20040116
简装版和完全版功能上只缺少了一个语音报时,只有一个闹钟皮肤和一个对话框皮肤,不记
www.onlinedown.net/soft/24763.htm
32. 极光多能闹钟 5.0
可以按具体日期、每日、每周、每月、农历生日等不同方式提醒
download.pchome.net/home/remind/20081.html
33. 雷达闹钟 1.01
主要特性:1、一个功能丰富、介面美观独特的超级酷闹钟。2、定时提醒你该做什么事,多
www.onlinedown.net/soft/14536.htm
34. 极光数字闹钟 2.0 for Win2000
免费绿色软件,真人语音报时,PC喇叭和音箱两种报时方式。间隔报时,一键报时,一键下
www.onlinedown.net/soft/13256.htm
35. 极光多能闹钟 V5.0
支持电脑自带喇叭响铃和电脑音乐,并可自谱喇叭音乐,享受DIY的乐趣。可以按具体?
download.21cn.com/list.php?id=25468
36. 悠悠闹钟 2.60
www.onlinedown.net/soft/45947.htm
37. 友梅闹钟万年历 2.0
万年历,可以定义提示内容,可以设置生日,可以设置每年提示一次,每月提示一次,每周提
www.onlinedown.net/soft/23598.htm
38. 桌面小闹钟 V1.2
一款时间管理软件,您可以随时增加、编辑、修改有关定时
www.skycn.com/soft/21871.html
39. 极光数字闹钟 2.0 for Win98/Me
免费绿色软件,真人语音报时,PC喇叭和音箱两种报时方式。间隔报时,一键报时,一键下
www.onlinedown.net/soft/13255.htm
40. 花想容闹钟 1.1
送给所有在电脑前长期工作的人,它提醒您间隔休息,使用简单,可以自启动,特别为女生
www.onlinedown.net/soft/34046.htm
41. 后卫PC小闹钟 2.0
一款桌面时钟软件,具有指定时间和流逝时间两种方式提醒,能更换桌面时钟的面版。
www.onlinedown.net/soft/32643.htm
42. 闹钟二千年 2.0.12
闹钟二千年是一个可以提供多功能的定时软件,它可以定时文字提示,定时播放声音(*.WAV
www.onlinedown.net/soft/12003.htm
43. 精致闹钟2003 V1.31 Build 20031228
V1.30版优化插件支持程式,更多新功能。修正了关机模块,基本上不再出现关机异常。
download.21cn.com/list.php?id=38486
44. 花想容闹钟 V1.1
提醒长期在电脑前工作的人间隔休息,非常小巧,使用简
www.skycn.com/soft/19053.html
45. 猫猫闹钟 1.3.3.218
①、可以添加无数条闹响记录(添加至记录列表中),每条记录可以设置不同的铃声(支持
www.onlinedown.net/soft/46410.htm
46. 雷达闹钟 1.01
一个功能丰富、介面美观独特的超级酷闹钟。定时提醒你该做什么事,多种提示方式。整点
dl.pconline.com.cn/html/1/9/dlid=6519&dltypeid=1&pn=0&.html
47. 音乐闹钟 2.0
一个可以定时播放音乐,定时关机的软件,播放音乐时间的长短可以自行设定,很适用于公
dl.pconline.com.cn/html/1/4/dlid=7214&dltypeid=1&pn=0&.html
48. 极光数字闹钟 2.0
本程序完全免费,且为绿色程序,无需安装,不在注册表中生成任何垃圾,卸载时只需删除
dl.pconline.com.cn/html/1/8/dlid=6188&dltypeid=1&pn=0&.html
49. 卡通小闹钟 Clock 2.0
一个闹钟程序,设定好时间,就能够闹铃、开启音乐、运行指定的某个程序、开关机等
dl.pconline.com.cn/html/1/6/dlid=4186&dltypeid=1&pn=0&.html
50. 无忧商务闹钟 1.1
提醒可靠和功能强劲是本软件最大特点,支持PC喇叭响铃可解决因忘记开音箱而误事的问题
dl.pconline.com.cn/html/1/1/dlid=9531&dltypeid=1&pn=0&.html
51. 极光多能闹钟 5.0
支持电脑自带喇叭响铃和电脑音乐,并可自谱喇叭音乐,享受DIY的乐趣。可以按具体日期
dl.pconline.com.cn/html/1/7/dlid=9277&dltypeid=1&pn=0&.html
52. 精致闹钟 2004 1.40
精致漂亮的闹钟程序,支持换肤,具有强大的定时关机和重要事件提醒功能。
dl.pconline.com.cn/html/1/4/dlid=11754&dltypeid=1&pn=0&.html
53. 雷达闹钟 V1.01
www.ddooo.com/softdown/2633.htm
54. 迷你小闹钟 V1.1
www.ddooo.com/softdown/2610.htm
55. 猫猫闹钟 1.3.0.186
www.ddooo.com/softdown/37944.htm
56. 冒险闹钟 1.1版V039
www.ddooo.com/softdown/38210.htm
57. 精科校园作息闹钟 V1.4
www.ddooo.com/softdown/18117.htm
58. 极光多能闹钟 V5.0
www.ddooo.com/softdown/3218.htm
59. 桌面小闹钟 V1.2
www.ddooo.com/softdown/25270.htm
60. 小桂闹钟 V1.93
www.ddooo.com/softdown/30408.htm
http://www.soft8.net/soft8.php?page=3&word=闹钟&site=all&by=name&num=228
【Web服务器超时处理】[ Apache ]
一般在性能很高的情况下,缺省所有超时配置都是30秒,但是在上传文件,或者网络速度很慢的情况下,那么可能触发超时 *** 作。
目前apachefastcgiphp-fpm模式下有三个超时设置:
fastcgi超时设置:
修改的fastcgi连接配置,类似如下:
复制代码 代码如下:
<IfModulemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfModule>
缺省配置是30s,如果需要定制自己的配置,需要修改配置,比如修改为100秒:(修改后重启apache):
复制代码 代码如下:
<IfModulemod_fastcgi.c>
FastCgiExternalServer/home/forum/apache/apache_php/cgi-bin/php-cgi-socket/home/forum/php5/etc/php-fpm.sock-idle-timeout100
ScriptAlias/fcgi-bin/"/home/forum/apache/apache_php/cgi-bin/"
AddHandlerphp-fastcgi.php
Actionphp-fastcgi/fcgi-bin/php-cgi
AddTypeapplication/x-
</IfModule>
如果超时会返回500错误,断开跟后端php服务的连接,同时记录一条apache错误日志:
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:commwithserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"aborted:idletimeout(30sec)
[ThuJan2718:30:152011][error][client10.81.41.110]FastCGI:incompleteheaders(0bytes)receivedfromserver"/home/forum/apache/apache_php/cgi-bin/php-cgi"
其他fastcgi配置参数说明:
复制代码 代码如下:
IdleTimeout发呆时限
ProcessLifeTime一个进程的最长生命周期,过期之后无条件kill
MaxProcessCount最大进程个数
DefaultMinClassProcessCount每个程序启动的最小进程个数
DefaultMaxClassProcessCount每个程序启动的最大进程个数
IPCConnectTimeout程序响应超时时间
IPCCommTimeout与程序通讯的最长时间,上面的错误有可能就是这个值设置过小造成的
MaxRequestsPerProcess每个进程最多完成处理个数,达成后自杀
[ Lighttpd ]
配置:lig
Lighttpd配置中,关于超时的参数有如下几个(篇幅考虑,只写读超时,写超时参数同理):
主要涉及选项:
server.max-keep-alive-idle=5
server.max-read-idle=60
server.read-timeout=0
server.max-connection-idle=360
复制代码 代码如下:
#每次keep-alive的最大请求数,默认值是16
server.max-keep-alive-requests=100
#keep-alive的最长等待时间,单位是秒,默认值是5
server.max-keep-alive-idle=1200
#lighttpd的work子进程数,默认值是0,单进程运行
server.max-worker=2
#限制用户在发送请求的过程中,最大的中间停顿时间(单位是秒),
#如果用户在发送请求的过程中(没发完请求),中间停顿的时间太长,lighttpd会主动断开连接
#默认值是60(秒)
server.max-read-idle=1200
#限制用户在接收应答的过程中,最大的中间停顿时间(单位是秒),
#如果用户在接收应答的过程中(没接完),中间停顿的时间太长,lighttpd会主动断开连接
#默认值是360(秒)
server.max-write-idle=12000
#读客户端请求的超时限制,单位是秒,配为0表示不作限制
#设置小于max-read-idle时,read-timeout生效
server.read-timeout=0
#写应答页面给客户端的超时限制,单位是秒,配为0表示不作限制
#设置小于max-write-idle时,write-timeout生效
server.write-timeout=0
#请求的处理时间上限,如果用了mod_proxy_core,那就是和后端的交互时间限制,单位是秒
server.max-connection-idle=1200
说明:
对于一个keep-alive连接上的连续请求,发送第一个请求内容的最大间隔由参数max-read-idle决定,从第二个请求起,发送请求内容的最大间隔由参数max-keep-alive-idle决定。请求间的间隔超时也由max-keep-alive-idle决定。发送请求内容的总时间超时由参数read-timeout决定。Lighttpd与后端交互数据的超时由max-connection-idle决定。
延伸阅读:
[ Nginx ]
配置:nf
复制代码 代码如下:
http{
#Fastcgi:(针对后端的fastcgi生效,fastcgi不属于proxy模式)
fastcgi_connect_timeout5#连接超时
fastcgi_send_timeout10#写超时
fastcgi_read_timeout10#读取超时
#Proxy:(针对proxy/upstreams的生效)
proxy_connect_timeout15s#连接超时
proxy_read_timeout24s#读超时
proxy_send_timeout10s#写超时
}
说明:
Nginx 的超时设置倒是非常清晰容易理解,上面超时针对不同工作模式,但是因为超时带来的问题是非常多的。
延伸阅读:
ml
ml
ml
【PHP本身超时处理】
[ PHP-fpm ]
配置:nf
复制代码 代码如下:
<?xmlversion="1.0"?>
<configuration>
//...
Setsthelimitonthenumberofsimultaneousrequeststhatwillbeserved.
EquivalenttoApacheMaxClientsdirective.
EquivalenttoPHP_FCGI_CHILDRENenvironmentinoriginalphp.fcgi
Usedwithanypm_style.
#php-cgi的进程数量
<valuename="max_children">128</value>
Thetimeout(inseconds)forservingasinglerequestafterwhichtheworkerprocesswillbeterminated
Shouldbeusedwhen'max_execution_time'inioptiondoesnotstopscriptexecutionforsomereason
'0s'means'off'
#php-fpm 请求执行超时时间,0s为永不超时,否则设置一个 Ns 为超时的秒数
<valuename="request_terminate_timeout">0s</value>
Thetimeout(inseconds)forservingofsinglerequestafterwhichaphpbacktracewillbedumpedtoslow.logfile
'0s'means'off'
<valuename="request_slowlog_timeout">0s</value>
</configuration>
说明:
在php.ini中,有一个参数max_execution_time可以设置PHP脚本的最大执行时间,但是,在php-cgi(php-fpm)中,该参数不会起效。真正能够控制PHP脚本最大执行时:
<valuename="request_terminate_timeout">0s</value>
就是说如果是使用mod_php5.so的模式运行max_execution_time是会生效的,但是如果是php-fpm模式中运行时不生效的。
延伸阅读:
[ PHP ]
配置:php.ini
选项:
max_execution_time=30
或者在代码里设置:
ini_set("max_execution_time",30)
set_time_limit(30)
说明:
对当前会话生效,比如设置0一直不超时,但是如果php的safe_mode打开了,这些设置都会不生效。
效果一样,但是具体内容需要参考php-fpm部分内容,如果php-fpm中设置了request_terminate_timeout的话,那么max_execution_time就不生效。
【后端&接口访问超时】
【HTTP访问】
一般我们访问HTTP方式很多,主要是:curl,socket,file_get_contents()等方法。
如果碰到对方服务器一直没有响应的时候,我们就悲剧了,很容易把整个服务器搞死,所以在访问http的时候也需要考虑超时的问题。
[ CURL 访问HTTP]
CURL 是我们常用的一种比较靠谱的访问HTTP协议接口的lib库,性能高,还有一些并发支持的功能等。
CURL:
curl_setopt($ch,opt)可以设置一些超时的设置,主要包括:
*(重要)CURLOPT_TIMEOUT设置cURL允许执行的最长秒数。
*(重要)CURLOPT_TIMEOUT_MS设置cURL允许执行的最长毫秒数。(在cURL7.16.2中被加入。从PHP5.2.3起可使用。)
CURLOPT_CONNECTTIMEOUT在发起连接前等待的时间,如果设置为0,则无限等待。
CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。在cURL7.16.2中被加入。从PHP5.2.3开始可用。
CURLOPT_DNS_CACHE_TIMEOUT设置在内存中保存DNS信息的时间,默认为120秒。
curl普通秒级超时:
$ch=curl_init()
curl_setopt($ch,CURLOPT_URL,$url)
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1)
curl_setopt($ch,CURLOPT_TIMEOUT,60)//只需要设置一个秒的数量就可以
curl_setopt($ch,CURLOPT_HTTPHEADER,$headers)
curl_setopt($ch,CURLOPT_USERAGENT,$defined_vars['HTTP_USER_AGENT'])
curl普通秒级超时使用:
curl_setopt($ch,CURLOPT_TIMEOUT,60)
curl如果需要进行毫秒超时,需要增加:
curl_easy_setopt(curl,CURLOPT_NOSIGNAL,1L)
或者是:
curl_setopt($ch,CURLOPT_NOSIGNAL,true)是可以支持毫秒级别超时设置的
curl一个毫秒级超时的例子:
复制代码 代码如下:
<?php
if(!isset($_GET['foo'])){
//Client
$ch=curl_init('')
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true)
curl_setopt($ch,CURLOPT_NOSIGNAL,1)//注意,毫秒超时一定要设置这个
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200)//超时毫秒,cURL7.16.2中被加入。从PHP5.2.3起可使用
$data=curl_exec($ch)
$curl_errno=curl_errno($ch)
$curl_error=curl_error($ch)
curl_close($ch)
if($curl_errno>0){
echo"cURLError($curl_errno):$curl_errorn"
}else{
echo"Datareceived:$datan"
}
}else{
//Server
sleep(10)
echo"Done."
}
?>
其他一些技巧:
1. 按照经验总结是:cURL版本>=libcurl/7.21.0版本,毫秒级超时是一定生效的,切记。
2. curl_multi的毫秒级超时也有问题。。单次访问是支持ms级超时的,curl_multi并行调多个会不准
[流处理方式访问HTTP]
除了curl,我们还经常自己使用fsockopen、或者是file *** 作函数来进行HTTP协议的处理,所以,我们对这块的超时处理也是必须的。
一般连接超时可以直接设置,但是流读取超时需要单独处理。
自己写代码处理:
复制代码 代码如下:
$tmCurrent=gettimeofday()
$intUSGone=($tmCurrent['sec']-$tmStart['sec'])*1000000
+($tmCurrent['usec']-$tmStart['usec'])
if($intUSGone>$this->_intReadTimeoutUS){
returnfalse
}
或者使用内置流处理函数stream_set_timeout()和stream_get_meta_data()处理:
复制代码 代码如下:
<?php
//Timeoutinseconds
$timeout=5
$fp=fsockopen("",80,$errno,$errstr,$timeout)
if($fp){
fwrite($fp,"GET/HTTP/1.0rn")
fwrite($fp,"Host:rn")
fwrite($fp,"Connection:Closernrn")
stream_set_blocking($fp,true)//重要,设置为非阻塞模式
stream_set_timeout($fp,$timeout)//设置超时
$info=stream_get_meta_data($fp)
while((!feof($fp))&&(!$info['timed_out'])){
$data.=fgets($fp,4096)
$info=stream_get_meta_data($fp)
ob_flush
flush()
}
if($info['timed_out']){
echo"ConnectionTimedOut!"
}else{
echo$data
}
}
file_get_contents超时:
复制代码 代码如下:
<?php
$timeout=array(
'http'=>array(
'timeout'=>5//设置一个超时时间,单位为秒
)
)
$ctx=stream_context_create($timeout)
$text=file_get_contents("",0,$ctx)
?>
fopen超时:
复制代码 代码如下:
<?php
$timeout=array(
'http'=>array(
'timeout'=>5//设置一个超时时间,单位为秒
)
)
$ctx=stream_context_create($timeout)
if($fp=fopen("","r",false,$ctx)){
while($c=fread($fp,8192)){
echo$c
}
fclose($fp)
}
?>
【MySQL】
php中的mysql客户端都没有设置超时的选项,mysqli和mysql都没有,但是libmysql是提供超时选项的,只是我们在php中隐藏了而已。
那么如何在PHP中使用这个 *** 作捏,就需要我们自己定义一些MySQL *** 作常量,主要涉及的常量有:
MYSQL_OPT_READ_TIMEOUT=11
MYSQL_OPT_WRITE_TIMEOUT=12
这两个,定义以后,可以使用options设置相应的值。
不过有个注意点,mysql内部实现:
1.超时设置单位为秒,最少配置1秒
2.但mysql底层的read会重试两次,所以实际会是3秒
重试两次+ 自身一次=3倍超时时间,那么就是说最少超时时间是3秒,不会低于这个值,对于大部分应用来说可以接受,但是对于小部分应用需要优化。
查看一个设置访问mysql超时的php实例:
复制代码 代码如下:
<?php
//自己定义读写超时常量
if(!defined('MYSQL_OPT_READ_TIMEOUT')){
define('MYSQL_OPT_READ_TIMEOUT',11)
}
if(!defined('MYSQL_OPT_WRITE_TIMEOUT')){
define('MYSQL_OPT_WRITE_TIMEOUT',12)
}
//设置超时
$mysqli=mysqli_init()
$mysqli->options(MYSQL_OPT_READ_TIMEOUT,3)
$mysqli->options(MYSQL_OPT_WRITE_TIMEOUT,1)
//连接数据库
$mysqli->real_connect("localhost","root","root","test")
if(mysqli_connect_errno()){
printf("Connectfailed:%s/n",mysqli_connect_error())
exit()
}
//执行查询sleep1秒不超时
printf("Hostinformation:%s/n",$mysqli->host_info)
if(!($res=$mysqli->query('selectsleep(1)'))){
echo"query1error:".$mysqli->error."/n"
}else{
echo"Query1:querysuccess/n"
}
//执行查询sleep9秒会超时
if(!($res=$mysqli->query('selectsleep(9)'))){
echo"query2error:".$mysqli->error."/n"
}else{
echo"Query2:querysuccess/n"
}
$mysqli->close()
echo"closemysqlconnection/n"
?>
延伸阅读:
【Memcached】
[PHP扩展]
php_memcache客户端:
连接超时:boolMemcache::connect(string$host[,int$port[,int$timeout]])
在get和set的时候,都没有明确的超时设置参数。
libmemcached客户端:在php接口没有明显的超时参数。
说明:所以说,在PHP中访问Memcached是存在很多问题的,需要自己hack部分 *** 作,或者是参考网上补丁。
[C&C++访问Memcached]
客户端:libmemcached客户端
说明:memcache超时配置可以配置小点,比如5,10个毫秒已经够用了,超过这个时间还不如从数据库查询。
下面是一个连接和读取set数据的超时的C++示例:
复制代码 代码如下:
//创建连接超时(连接到Memcached)
memcached_st*MemCacheProxy::_create_handle()
{
memcached_st*mmc=NULL
memcached_return_tprc
if(_mpool!=NULL){//getfrompool
mmc=memcached_pool_pop(_mpool,false,&prc)
if(mmc==NULL){
__LOG_WARNING__("MemCacheProxy","gethandlefrompoolerror[%d]",(int)prc)
}
returnmmc
}
memcached_st*handle=memcached_create(NULL)
if(handle==NULL){
__LOG_WARNING__("MemCacheProxy","create_handleerror")
returnNULL
}
//设置连接/读取超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_HASH,MEMCACHED_HASH_DEFAULT)
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_NO_BLOCK,_noblock)//参数MEMCACHED_BEHAVIOR_NO_BLOCK为1使超时配置生效,不设置超时会不生效,关键时候会悲剧的,容易引起雪崩
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT,_connect_timeout)//连接超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_RCV_TIMEOUT,_read_timeout)//读超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_SND_TIMEOUT,_send_timeout)//写超时
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_POLL_TIMEOUT,_poll_timeout)
//设置一致hash
//memcached_behavior_set_distribution(handle,MEMCACHED_DISTRIBUTION_CONSISTENT)
memcached_behavior_set(handle,MEMCACHED_BEHAVIOR_DISTRIBUTION,MEMCACHED_DISTRIBUTION_CONSISTENT)
memcached_returnrc
for(uinti=0i<_server_counti++){
rc=memcached_server_add(handle,_ips[i],_ports[i])
if(MEMCACHED_SUCCESS!=rc){
__LOG_WARNING__("MemCacheProxy","addserver[%s:%d]failed.",_ips[i],_ports[i])
}
}
_mpool=memcached_pool_create(handle,_min_connect,_max_connect)
if(_mpool==NULL){
__LOG_WARNING__("MemCacheProxy","create_poolerror")
returnNULL
}
mmc=memcached_pool_pop(_mpool,false,&prc)
if(mmc==NULL){
__LOG_WARNING__("MyMemCacheProxy","gethandlefrompoolerror[%d]",(int)prc)
}
//__LOG_DEBUG__("MemCacheProxy","gethandle[%p]",handle)
returnmmc
}
//设置一个key超时(set一个数据到memcached)
boolMemCacheProxy::_add(memcached_st*handle,unsignedint*key,constchar*value,intlen,unsignedinttimeout)
{
memcached_returnrc
chartmp[1024]
snprintf(tmp,sizeof(tmp),"%u#%u",key[0],key[1])
//有个timeout值
rc=memcached_set(handle,tmp,strlen(tmp),(char*)value,len,timeout,0)
if(MEMCACHED_SUCCESS!=rc){
returnfalse
}
returntrue
}
//Memcache读取数据超时(没有设置)
libmemcahed源码中接口定义:
LIBMEMCACHED_APIchar*memcached_get(memcached_st*ptr,constchar*key,size_tkey_length,size_t*value_length,uint32_t*flags,memcached_return_t*error)
LIBMEMCACHED_APImemcached_return_tmemcached_mget(memcached_st*ptr,constchar*const*keys,constsize_t*key_length,size_tnumber_of_keys)
从接口中可以看出在读取数据的时候,是没有超时设置的。
延伸阅读:
【如何实现超时】
程序中需要有超时这种功能,比如你单独访问一个后端Socket模块,Socket模块不属于我们上面描述的任何一种的时候,它的协议也是私有的,那么这个时候可能需要自己去实现一些超时处理策略,这个时候就需要一些处理代码了。
[PHP中超时实现]
一、初级:最简单的超时实现 (秒级超时)
思路很简单:链接一个后端,然后设置为非阻塞模式,如果没有连接上就一直循环,判断当前时间和超时时间之间的差异。
phpsocket中实现原始的超时:(每次循环都当前时间去减,性能会很差,cpu占用会较高)
复制代码 代码如下:
<?
$host="127.0.0.1"
$port="80"
$timeout=15//timeoutinseconds
$socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP)
ordie("Unabletocreatesocketn")
socket_set_nonblock($socket) //务必设置为阻塞模式
ordie("Unabletosetnonblockonsocketn")
$time=time()
//循环的时候每次都减去相应值
while(!@socket_connect($socket,$host,$port))//如果没有连接上就一直死循环
{
$err=socket_last_error($socket)
if($err==115||$err==114)
{
if((time()-$time)>=$timeout)//每次都需要去判断一下是否超时了
{
socket_close($socket)
die("Connectiontimedout.n")
}
sleep(1)
continue
}
die(socket_strerror($err)."n")
}
socket_set_block($this->socket)//还原阻塞模式
ordie("Unabletosetblockonsocketn")
?>
二、升级:使用PHP自带异步IO去实现(毫秒级超时)
说明:
异步IO:异步IO的概念和同步IO相对。当一个异步过程调用发出后,调用者不能立刻得到结果。实际处理这个调用的部件在完成后,通过状态、通知和回调来通知调用者。异步IO将比特分成小组进行传送,小组可以是8位的1个字符或更长。发送方可以在任何时刻发送这些比特组,而接收方从不知道它们会在什么时候到达。
多路复用:复用模型是对多个IO *** 作进行检测,返回可 *** 作集合,这样就可以对其进行 *** 作了。这样就避免了阻塞IO不能随时处理各个IO和非阻塞占用系统资源的确定。
使用socket_select()实现超时
socket_select(...,floor($timeout),ceil($timeout*1000000))
select的特点:能够设置到微秒级别的超时!
使用socket_select()的超时代码(需要了解一些异步IO编程的知识去理解)
复制代码 代码如下:
编程 调用类 编程#
<?php
$server=newServer
$client=newClient
for(){
foreach($select->can_read(0)as$socket){
if($socket==$client->socket){
//NewClientSocket
$select->add(socket_accept($client->socket))
}
else{
//there'ssomethingtoreadon$socket
}
}
}
?>
编程 异步多路复用IO &超时连接处理类 编程
<?php
classselect{
var$sockets
functionselect($sockets){
$this->sockets=array()
foreach($socketsas$socket){
$this->add($socket)
}
}
functionadd($add_socket){
array_push($this->sockets,$add_socket)
}
functionremove($remove_socket){
$sockets=array()
foreach($this->socketsas$socket){
if($remove_socket!=$socket)
$sockets[]=$socket
}
$this->sockets=$sockets
}
functioncan_read($timeout){
$read=$this->sockets
socket_select($read,$write=NULL,$except=NULL,$timeout)
return$read
}
functioncan_write($timeout){
$write=$this->sockets
socket_select($read=NULL,$write,$except=NULL,$timeout)
return$write
}
}
?>
[C&C++中超时实现]
一般在LinuxC/C++中,可以使用:alarm()设置定时器的方式实现秒级超时,或者:select()、poll()、epoll()之类的异步复用IO实现毫秒级超时。也可以使用二次封装的异步io库(libevent,libev)也能实现。
一、使用alarm中用信号实现超时 (秒级超时)
说明:Linux内核connect超时通常为75秒,我们可以设置更小的时间如10秒来提前从connect中返回。这里用使用信号处理机制,调用alarm,超时后产生SIGALRM信号(也可使用select实现)
用alarym秒级实现 connect设置超时代码示例:
复制代码 代码如下:
//信号处理函数
staticvoidconnect_alarm(intsigno)
{
debug_printf("SignalHandler")
return
}
//alarm超时连接实现
staticvoidconn_alarm()
{
Sigfunc*sigfunc//现有信号处理函数
sigfunc=signal(SIGALRM,connect_alarm)//建立信号处理函数connect_alarm,(如果有)保存现有的信号处理函数
inttimeout=5
//设置闹钟
if(alarm(timeout)!=0){
//...闹钟已经设置处理
}
//进行连接 *** 作
if(connect(m_Socket,(structsockaddr*)&addr,sizeof(addr))<0){
if(errno==EINTR){//如果错误号设置为EINTR,说明超时中断了
debug_printf("Timeout")
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)