php-fpm进程关闭与重启脚本详解
先来理解一下什么是php-fpm
PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的。
PHP-FPM其实是PHP源代码的一个补丁,旨在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,在编译安装PHP后才可以使用。 现在我们可以在最新的PHP 5.3.2的源码树里下载得到直接整合了PHP-FPM的分支,据说下个版本会融合进PHP的主分支去。相对Spawn-FCGI,PHP-FPM在CPU和内存方面的控制都更胜一筹,而且前者很容易崩溃,必须用crontab进行监控,而PHP-FPM则没有这种烦恼。
PHP5.3.3已经集成php-fpm了,不再是第三方的包了。PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置,比spawn-fcgi具有更多优点,所以被PHP官方收录了。在./configure的时候带 –enable-fpm参数即可开启PHP-FPM。 使用PHP-FPM来控制PHP-CGI的FastCGI进程
master进程可以理解以下信号
INT, TERM 立刻终止
QUIT 平滑终止
USR1 重新打开日志文件
USR2 平滑重载所有worker进程并重新载入配置和二进制模块
示例:
php-fpm 关闭:
代码如下 | 复制代码 |
kill -INT `cat /usr/local/php/var/run/php-fpm.pid` |
php-fpm 重启:
代码如下 | 复制代码 |
kill -USR2 `cat /usr/local/php/var/run/php-fpm.pid` |
查看php-fpm进程数:
代码如下 | 复制代码 |
ps aux | grep -c php-fpm |
php-fmp的重启 (方法二)
先执行
代码如下 | 复制代码 |
killall php-fpm |
再执行(usr/local/php是php的安装目录)
代码如下 | 复制代码 |
/usr/local/php/sbin/php-fpm & |
闲来无事,想了想PHP如何实现事件监听,参考了jQuery的事件绑定思路,简单的实现了一下。
主要功能:
1.绑定事件 支持一个事件绑定多个动作,支持绑定一次性事件
2.触发事件
3.注销事件
代码如下 | 复制代码 |
class Event |
以下是一些调用的例子:
代码如下 | 复制代码 |
// 增加监听walk事件 |
SphinxClient::open
(PECL sphinx >= 1.0.3)
SphinxClient::open — 建立到搜索服务端的持久连接
说明
public bool SphinxClient::open ( void )
建立到搜索服务端的持久连接.
参数
此函数没有参数。
返回值
成功时返回 TRUE, 或者在失败时返回 FALSE.
今日在做PHP系统代码优化时,对sphinx的长连接做了一些分析发现php的sphinx api并不是我们想象中的那样会在php-fpm的fastcgi状态下一直与sphinx的searchd进程保持长连接,sphinx的api接口中open()方法仅仅提供了在一次会话请求中保证多个sphinx调用在单个php进程中是共用一个sphinx tcp连接通道,当php解释运行完,与sphinx的连接也会自动断开,而不是保持连接状态。
这篇帖子也佐证了楼主的这个想法:http://sphinxsearch.com/forum/view.html?id=7200
> So it seems that the definition of 'persistent connection' in Sphinx is different from
> persistent MySql connections when using a PhP API : the persistence is only across
> multiple calls *in the same php request execution* and not persistence within the client
> process i.e. across multiple php requests.
我们可以做一个这样的实验来证明我的观点:
给php增加sphinx.so扩展,然后写如下测试代码:
<!--?php<br /-->
$s = new SphinxClient();
var_dump($s);
$s->setServer('192.168.1.108','9312');
//$s->open();
var_dump($s->query('abxxxx'));
var_dump($s->query('abxxxx'));
注意这里$s->open()先屏蔽,然后我们在cli状态下利用strace命令跟踪执行此php脚本,收集系统调用信息会发现:
在系统调用中出现了两次connect到192.168.1.108的请求。也就是说在没调用open方法的时候,在同一个php运行时中会导致两次对sphinx产生的tcp请求。
611 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
612 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (Operation now in progress)
613 select(4, NULL, [3], NULL, {60, 0}) = 1 (out [3], left {59, 999996})
614 fcntl64(3, F_SETFL, O_RDONLY) = 0
615 send(3, "1", 4, MSG_NOSIGNAL) = 4
616 recv(3, "1", 4, 0) = 4
617 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
618 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
619 recv(3, "131`", 8, 0) = 8
620 recv(3, "25title4text2"..., 96, 0) = 96
621 close(3)
。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。
756 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 3
757 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
758 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (Operation now in progress)
759 select(4, NULL, [3], NULL, {60, 0}) = 1 (out [3], left {59, 999997})
760 fcntl64(3, F_SETFL, O_RDONLY) = 0
761 send(3, "1", 4, MSG_NOSIGNAL) = 4
762 recv(3, "1", 4, 0) = 4
763 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
764 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
765 recv(3, "131`", 8, 0) = 8
766 recv(3, "25title4text2"..., 96, 0) = 96
767 close(3) = 0
768 write(1, "array(9) {n", 11array(9) {
然后我们取消open调用的注释,继续strace,会发现这时候依然是连续调用两次query方法,但在第一次query调用后api不会立即close掉tcp连接,而是继续给到第二次query调用使用。
611 fcntl64(3, F_SETFL, O_RDONLY|O_NONBLOCK) = 0
612 connect(3, {sa_family=AF_INET, sin_port=htons(9312), sin_addr=inet_addr("192.168.1.108")}, 16) = -1 EINPROGRESS (Operation now in progress)
613 select(4, NULL, [3], NULL, {60, 0}) = 1 (out [3], left {59, 999996})
614 fcntl64(3, F_SETFL, O_RDONLY) = 0
615 send(3, "1", 4, MSG_NOSIGNAL) = 4
616 recv(3, "1", 4, 0) = 4
617 send(3, "441", 12, MSG_NOSIGNAL) = 12
618 select(4, [3], NULL, [3], {0, 0}) = 0 (Timeout)
619 send(3, "1312241", 16, MSG_NOSIGNAL) = 16
620 send(3, "246abxx"..., 140, MSG_NOSIGNAL) = 140
621 recv(3, "131`", 8, 0) = 8
622 recv(3, "25title4text2"..., 96, 0) = 96
623 write(1, "array(9) {n", 11array(9) {
624 ) = 11
本文章记录一下自己在学习php MemCache内存缓存的一些学习笔记与理解,现在与各位朋友分享,希望此文章对大家有帮助。
一、Memcache简介
Memcache(内存,缓存) :是一个高性能的分布式的内存对象缓存系统。通过在内存里维护一个巨大的HashTable。由Memcached来管理这个巨大的HashTable。
二、Memcache 与 Memcached的区别
Memcache是软件名称,Memcached是启动后的进程名称。
三、Memcache工作原理
memcached是以守护程序方式运行于一个或多个服务器中,随时会接收客户端的连接和操作。
在没有安装memcache的时候网站工作的原理是:浏览器访问服务器脚本,然后服务器脚本访问数据库,处理后输出给浏览器。
而如果你的服务器安装了memcache的话,在执行了第一次数据库查询后,服务器脚本后把结果集存储到memcached内存缓存中,以后使用的时候就可不必查询数据库而是直接向memcached内存缓存索取,大大提高的效率。
四、安装Memcache服务器
代码如下 | 复制代码 |
wget http://memcached.googlecode.com/files/memcached-1.4.15.tar.gz |
五、Memcached服务器启动时的基本设置
如:Memcahced –d –m 128 –l 192.168.1.111 –p 11211 –u root
下边是Memcahced 部分参数的说明
-p memcached监听的TCP端口
-l 连接的IP地址, 默认是本机
-d 以daemon方式运行,将程序放入后台
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB ,最大好像2G
-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助
memcache功能太简单了,只能 set get 和delete, 只能保存key-value的数据, 不能保存列表。 当然也可以把一个列表给序列化了之后存进memcache, 但是会存在并发的问题, 每次保存数据(插队或者出队)的时候都要给数据加锁,在高并发的情况下很难保证数据的一致性!
但是memcache 有一个 increment 的操作,为某一个键对应的值进行加1(实际上是加法运算, 默认加1), 这个操作是原子性的, 所以我们可以通过这个来维护一个自增的id来保证数据的唯一。 再加上两个指针来维护起始键值, 这样就构建了一个简单的但相队列!!
上代码:
代码如下 | 复制代码 |
<?php /** * memcache构建的简单内存队列 * * @author: jeffjing */ class memList { private $memcache; // memcache类 private $queKeyPrefix; //数据键前缀 private $startKey; //开始指针键 private $startKey; //结束指针键 public function __construct($key){ $this->queKeyPrefix = "MEMQUE_{$key}_"; $this->startKey = "MEMQUE_SK_{$key}"; $this->endKey = "MEMQUE_EK_{$key}"; } /** * 获取列表 * 先拿到开始结束指针, 然后去拿数据 * * @return array */ public function getList(){ $startP = $this->memcache->get($this->startKey); $endP = $this->memcache->get($this->endKey); empty($startP) && $startP = 0; empty($endP) && $endP = 0; $arr = array(); for($i = $startP ; $i < $endP; ++$i) { $key = $this->queKeyPrefix . $i; $arr[] = $this->memcache->get($key); } return $arr; } /** * 插入队列 * 结束指针后移,拿到一个自增的id * 再把值存到指针指定的位置 * * @return void */ public function in($value){ $index = $this->memcache->increment($this->endKey); $key = $this->queKeyPrefix . $index; $this->memcache->set($key, $value); } /** * 出队 * 很简单, 把开始值取出后开始指针后移 * * @return mixed */ public function out(){ $result = $this->memcache->get($this->startKey); $this->memcache->increment($this->startKey); return $result; } } |
关于memcached的一些事情
内存存储方式(slab allocator)
memcached的数据存储方式为slab allocator即数据分片, 在服务启动的时候先把内存分成不同大小的 chunk, 当有数据过来的时候来存储到一个合适大小的chunk当中
之前版本是直接分配内存, 导致内存碎片 随机查找等问题。。。
数据过期删除机制
memcached在数据过期之后,并不会去删除数据, 但是不能访问过期的数据, 过期数据占用的空间会被重复利用
memcached采用lazy expiration.不会去主动扫描一个数据项是否过期, 而是在数据get的时候判断是否已经过期.
删除的算法是LRU(Least Recently Used) , 优先删除最近使用较少的数据
memcached的分布式机制
虽说memcached是一个分布式的缓存, 但是memcached本身并没有实现任何分布式的机制, 分布式的功能主要是由客户端来实现的。
程序通过addserver增加多个memcahced服务到客户端(memcache扩展), 在存取数据之前,客户端会先通过hash算法得到存储数据的节点, 然后再去存取数据, 当其中一台memcached服务器挂掉或者新增一台memcached服务器, hash算法得到的存储数据的节点就会变化, 去新的服务器上去存取数据。
相关文章
- PHP-FPM我们相信各位用高版本的php经常使用到了,下面整理了一些关于PHP-FPM的笔记,有兴趣的可进来看看。 今天赶上了123System OPenVZ VPS全场半价的机会,购入了一...2016-11-25
php-fpm 启动报please specify user and group other than root, pool ‘default’
本文章来给大家介绍关于php-fpm 启动报please specify user and group other than root, pool ‘default’的解决办法。 安装PHP ,配置fpm 成功后启动发现报错: St...2016-11-25php性能分析之php-fpm慢执行日志slow log用法浅析
这篇文章主要介绍了php性能分析之php-fpm慢执行日志slow log用法,结合实例形式分析了php慢执行日志的功能与相关使用技巧,需要的朋友可以参考下...2016-10-20- 下面我们来看一篇关于php性能分析之php-fpm的慢执行日志slow log文章,希望文章对各位有帮助 众所周知,mysql有slow query log,根据慢查询日志,我们可以知道那些sql...2016-11-25
解决php-fpm.service not found问题的办法
这篇文章主要给大家介绍了解决php-fpm.service not found问题的办法,文中详细介绍的解决这个问题的思路与过程,分享出来给大家,如果有同样问题的朋友就不用到处找解决办法了,下面来一起看看吧。...2017-06-11- Nginx 启动脚本 重启脚本,学习使用centos配置服务器的朋友可以参考下。...2016-01-27
- 小VPS受系统资源的限制,访问量过大,超过系统所能承受的极限时,有一部分请求就会502了。在系统资源够用的情况,优化nginx,php-fpm,以及系统本身...2016-05-22
为应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制
为应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制服务器经常产生“应用程序池 'DefaultAppPool' 提供服务的进程关闭时间超过了限制。进程 ID 是 '2068'。”的错误,导致iis处于假死状态,经了解是IIS应用程序池的设置问题...2016-01-27- 这篇文章主要介绍了安装配置php-fpm来搭建Nginx+PHP的生产环境的方法,php-fpm的作用是将FastCGI进程管理整合进PHP包,需要的朋友可以参考下...2016-01-27
- 本文章来为各位介绍一篇关于php-fpm设置socket方式连接FastCGI的例子,希望文章可能帮助到各位深入的理解socket方式连接FastCGI的知识。 socket方式不会走到tcp层,t...2016-11-25
nginx php-fpm环境中chroot功能的配置使用方法
这篇文章主要介绍了nginx php-fpm环境中chroot功能的配置使用方法,此方法是比禁用PHP敏感函数更好的一个安全防护手手段,需要的朋友可以参考下...2016-01-27实现Nginx中使用PHP-FPM时记录PHP错误日志的配置方法
最近在本地搭建的LNMP的开发环境。为了开发的时候不影响前端的正常开发就屏蔽的PHP里面php.ini中的一些错误提示。但是这样一来,就影响到了后端开发的一些问题比如不能及时调试开发中的一些问题...2016-01-27- 本文章来为各位介绍php-fpm 启动参数及重要配置详解,如果对于php-fpm配置或参数有不了解的就可以和111cn小编一起来看看。 约定几个目录 /usr/local/php/sbin/p...2016-11-25
- PHP-FPM如果出现存存泄漏问题可能导致服务器内存不足从而导致服务器资源用尽了,这样就会导致网站无法访问了,下面一起来看一篇避免PHP-FPM内存泄漏导致内存耗尽的配置。...2016-11-25
nginx php-fpm中启用慢日志配置(用于检测执行较慢的PHP脚本)
这篇文章主要介绍了nginx php-fpm中启用慢日志配置,php-fpm慢日志slowlog设置可以让我们很好的看见哪些php进程速度太慢而导致的网站问题,可以让我们方便的找到问题的所在,需要的朋友可以参考下...2016-01-27php提示Undefined variable: 引发的几个操作php-fpm等
下面来看一个php提示Undefined variable: 引发的几个操作php-fpm的文章,希望本文章能给各位同学带来帮助哦。 以前写的一个php脚本,在换成php5.5.8的版本的时候出...2016-11-25- 今天我来给各位同学介绍一下关于php-fpm进程关闭与重启命令吧,PHP-FPM是一个PHP FastCGI管理器,是只用于PHP的并且PHP5.3.3已经集成php-fpm了,不再是第三方的包了哦。...2016-11-25
- 关于CGI 和 PHP-FPM我相信大家用会用但它们到底怎么区别及哪里不一样可能不知道了,这里为各位整理一篇关于CGI 和 PHP-FPM的对比分析文章。 首先我们引入一些概念,...2016-11-25
- PHP-FPM在linux系统中如果优化做得好那么可以负载更大的内容了,今天我们就一起来看一篇关于PHP-FPM性能优化参考文章,希望对大家有帮助。 php-fpm.conf有两个至关重...2016-11-25
nginx加php-fpm出现502 bad gateway错误的5种解决方法
这篇文章主要介绍了nginx加php-fpm环境中出现502 bad gateway错误的5种解决方法,总结归纳服务器出现502错误的原因多数为连接过多和脚本超时,本文总结了5种解决方法,需要的朋友可以参考下...2016-01-27