平滑重启之php-fpm

       众所周知php是动态型语言,在每次处理请求时都是临时进行代码的编译执行因此对于这种语言在上线时是不须要重启的,直接采用文件覆盖的方式进行或者采用软链的方式进行替换也能够,因为这种特性使得其性能常常被人诟病,因此就有了php-fpm这种进程管理工具来配合其使用,使得现在php-fpm成为了php的标配(apache就不是利用这种的),可是php-fpm是用c编写的,c是静态型语言,因此在修改php-fpm的配置时仍是须要重启的(不过这种状况一帮不多见),那么在须要重启时php-fpm又是如何运做的呢? 下面来说讲。php

     在平滑重启时须要考虑的问题通常有两方面:一方面,未结束的请求如何处理,另外一方面,进程处理时间过长如何处理。对于这两个方面,php-fpm都给出了本身的解决方法,这两方面是相互进行的,不是独立的。apache

    注意:给php-fpm发送重启信号kill -USR2 pid  这个pid既能够是master进程的pid,也能够是worker进程的pid,若是是master进程的pid就会吧全部worker进程重启,若是是worker进程的pid就是只重启当个worker进程。bash

     未结束的请求如何处理:函数

           发送重启信号是会通知master,master获取event而后给worker进程发送退出的信号SIGQUIT,worker进程接收信号后交给对应的信号处理函数处理,信号函数就是将in_shutdown变量置为1,这样worker进程 在调用fcgi_accept_request进程下一个进程处理时就不接收直接退出了,(注意这里也会有处理时间过长问题),若是进程尚未执行结束也会退出,这样就会出现代码逻辑执行一半的状况,因此要特别注意。从这里能够看出来php-fpm的重启逻辑简单粗暴,(在规定时间内处理完请求,完成不了就无论了),因为php-fpm一个worker进程每次只能处理一个请求,因此不须要计数器之类的,这样就更简单了。php-fpm

     处理时间过长如何处理:工具

          在给php-fpm进程发送信号时,php-fpm进程就会重启操做流程,在整个重启操做流程当中为了保证顺利的重启增长了超时机制,超过了设置的时间就会强制重启,中断正在进行中的进程。这个配置是在php-fpm.ini文件中设置的,process_control_timeout=10 这个字段就是用来设置的,表示最多10秒。性能

  实例:      测试

          代码测试,在设置10秒超时状况下,代码逻辑须要11秒的状况下,重启会形成代码执行部分而后退出的状况。ui

public function actionTest(){     
      $model = new bad(); 
      $model->save(array('id'=>75329370));
      //须要特别注意不能使用sleep方法进行时间的等待,
      //由于是调用系统的sleep方法,在重启时会使其失效    
      $model->db()->query('select sleep(11) from orders where id=75329370');                                                                                                            
       $model2 = new lock();
        $model2->save(array('id'=>10251,'info'=>1212));  
       return; 
   }复制代码
相关文章
相关标签/搜索