加入收藏 | 设为首页 | 会员中心 | 我要投稿 鄂州站长网 (https://www.0711zz.com.cn/)- 云通信、区块链、物联平台、操作系统、高性能计算!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

浅析PHP配置文件中的几种超时配置

发布时间:2022-08-10 12:03:32 所属栏目:PHP教程 来源:互联网
导读:一、概要 php.ini 和 php-fpm.conf 中有很多超时相关的配置,那么这些配置到底有什么作用呢?在源码中又是怎么实现的呢?这篇文章就来讲讲下面几种超时配置: php.ini max_execution_time max_input_time php-fpm.conf process_control_timeout request_term
  一、概要
  php.ini 和 php-fpm.conf 中有很多超时相关的配置,那么这些配置到底有什么作用呢?在源码中又是怎么实现的呢?这篇文章就来讲讲下面几种超时配置:
 
  php.ini
  max_execution_time
  max_input_time
  php-fpm.conf
  process_control_timeout
  request_terminate_timeout
  request_slowlog_timeout
  运行环境: Mac 10.14.2 + PHP 7.3.7
 
  二、配置解析规则
  解析规则
  php.ini的解析是在php_module_startup()阶段完成,ini_entry是在 main.c 中为每个php.ini配置定义的解析规则,格式如下:
 
 
  ZEND_INI_ENTRY3_EX(name, default_value, modifiable, on_modify, arg1, arg2, arg3, displayer)
 
  PHP为不同类型的配置定义了很多宏,ZEND_INI_ENTRY3_EX 是它们展开后的最终宏,比如PHP_INI_ENTRY宏
 
 
  PHP_INI_ENTRY(name, default_value, modifiable, on_modify)
 
  参数解释
  name: 配置名称
 
  default_value: 配置默认值
 
  modifiable: 配置的可被设定范围
 
  这些模式决定着一个 PHP 的指令在何时何地,是否能够被设定。手册中的每个指令都有其所属的模式。例如有些指令可以在 PHP 脚本中用 ini_set() 来设定,而有些则只能在 php.ini 或 httpd.conf 中。
 
  例如 output_buffering 指令是属于 PHP_INI_PERDIR,因而就不能用 ini_set() 来设定。但是 display_errors 指令是属于 PHP_INI_ALL 因而就可以在任何地方被设定,包括 ini_set()。
 
  模式 含义
  PHP_INI_USER 可在用户脚本(例如 ini_set())或 Windows 注册表(自 PHP 5.3 起)以及 .user.ini 中设定
  PHP_INI_PERDIR 可在 php.ini,.htaccess 或 httpd.conf 中设定
  PHP_INI_SYSTEM 可在 php.ini 或 httpd.conf 中设定
  PHP_INI_ALL 可在任何地方设定
  on_modify: 配置修改函数
 
  三、max_input_time、max_execution_time
  因为max_input_time 和 max_execution_time 联系比较密切,所以放在一起来讲。
 
  php.ini 解释
  max_input_time
  ; Maximum amount of time each script may spend parsing request data. It's a good
  ; idea to limit this time on productions servers in order to eliminate unexpectedly
  ; long running scripts.
  ; Note: This directive is hardcoded to -1 for the CLI SAPI
  ; http://php.net/max-input-time
 
  翻译过来就是:max_input_time是每个脚本可以花在解析请求数据上的最大时间。在生产服务器上通过限制max_input_time可以清除掉长时间运行的脚本。在CLI模式下会硬编码为-1,即无限制。
 
  max_execution_time
  ; Maximum execution time of each script, in seconds
  ; http://php.net/max-execution-...
  ; Note: This directive is hardcoded to 0 for the CLI SAPI
 
  翻译:max_execution_time是每个脚本的最大可执行时间。在CLI模式下硬编码为0
 
  配置解析规则
 
 
 
  // max_input_time,默认值为无限制
 
  STD_PHP_INI_ENTRY("max_input_time", "-1",    PHP_INI_SYSTEM|PHP_INI_PERDIR, OnUpdateLong, max_input_time, php_core_globals, core_globals)
 
     
 
  // max_execution_time,默认值为30s,修改函数为OnUpdateTimeout
 
  PHP_INI_ENTRY("max_execution_time", "30",    PHP_INI_ALL, OnUpdateTimeout)
 
  OnUpdateTimeout()函数如下,由第二节可知配置解析发生在php_module_startup()阶段,此时EG(timeout_seconds)被赋值为了max_execution_time,但还没有设置定时器。
 
 
  // main.c
 
  static PHP_INI_MH(OnUpdateTimeout)
 
  {
 
      if (stage==PHP_INI_STAGE_STARTUP) {
 
          /* Don't set a timeout on startup, only per-request */
 
      /* EG(timeout_seconds) = max_execution_time */
 
          ZEND_ATOL(EG(timeout_seconds), ZSTR_VAL(new_value));
 
          return SUCCESS;
 
      }
 
      zend_unset_timeout();
 
      ZEND_ATOL(EG(timeout_seconds), ZSTR_VAL(new_value));
 
      zend_set_timeout(EG(timeout_seconds), 0);
 
      return SUCCESS;
 
  }
 
  设置超时定时器
 
 
  // main.c
 
  int php_request_startup(void)
 
  {
 
    ......
 
    if (PG(max_input_time) == -1) {
 
      zend_set_timeout(EG(timeout_seconds), 1);
 
    } else {
 
    zend_set_timeout(PG(max_input_time), 1);
 
    }
 
    ......
 
  }
 
   
 
  int php_execute_script(zend_file_handle *primary_file)
 
  {
 
    ......
 
      if (PG(max_input_time) != -1) {
 
      zend_set_timeout(INI_INT("max_execution_time"), 0);
 
    }  
 
    ......
 
  }
 
  从上面代码可以看到,如果设置了max_input_time(即值不等于-1,-1可以认为是在CLI模式下),在php_request_startup()阶段会设置一个定时器,超时时间为max_input_time;在php_execute_script()阶段会重新设置一个定时器,超时时间为max_execution_time。那么整个PHP脚本执行的最大执行时间就等于max_input_time + max_execution_time。
 
  如果没有设置max_input_time的话(即值等于-1),在php_request_startup()阶段也会设置一个定时器,但超时时间被设为了EG(timeout_seconds),而EG(timeout_seconds)已经在php_module_startup()阶段被赋值为max_execution_time,所以此时的超时时间就是max_execution_time;在php_execute_script()阶段不会重新设置定时器,前一阶段设置的max_execution_time定时器仍然生效着。那么整个PHP脚本的最大执行时间就是max_execution_time。

(编辑:鄂州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读