返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP文件中怎么配置超时时间
  • 848
分享到

PHP文件中怎么配置超时时间

2023-06-29 10:06:39 848人浏览 八月长安
摘要

今天小编给大家分享一下PHP文件中怎么配置超时时间的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、概要php.ini 和

今天小编给大家分享一下PHP文件中怎么配置超时时间的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

PHP文件中怎么配置超时时间

一、概要

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_timemax_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,修改函数为OnUpdateTimeoutPHP_INI_ENTRY("max_execution_time", "30",    PHP_INI_ALL, OnUpdateTimeout)

OnUpdateTimeout()函数如下,由第二节可知配置解析发生在php_module_startup()阶段,此时EG(timeout_seconds)被赋值为了max_execution_time,但还没有设置定时器。

// main.cstatic PHP_INI_MH(OnUpdateTimeout){    if (stage==PHP_INI_STAGE_STARTUP) {                    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.cint 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
PHP文件中怎么配置超时时间

zend_set_time() 使用setitimer(ITIMER_PROF, &t_r, NULL); 来实现定时器,ITIMER_PROF会统计包括用户态和内核态下所花费的时间,而像sleep()这样的系统调用会让进程挂起,不占用cpu时间片,所以这俩超时时间是不包括sleep()时间的。

当定时器到时间后,ZendVM会抛出E_ERROR,即Fatal error错误。

四、process_control_timeout

php-fpm.conf 解释
; Time limit for child processes to wait for a Reaction on signals from master.
; Available units: s(econds), m(inutes), h(ours), or d(ays)
; Default Unit: seconds

翻译:process_control_timeout是留给子进程处理来自master进程信号的时间限制。

分析

当master进程接收到SIGINTSIGTERMSIGQUITSIGUSR2这些信号时,会调用fpm_pctl()来进行处理。

首先master进程会根据 接收到的信号 和 当前fpm的运行状态 来决定发送给worker进程的是SIGQUIT还是SIGTERM信号,同时注册时间为process_control_timeout的定时事件。

如果在process_control_timeout时间内子进程没有退出,那么master进程会升级SIGQUITSIGTERMSIGTERMSIGKILL,并注册1s的定时事件。SIGKILL就直接终止worker进程了,SIGTERM还能再给worker进程1s的时间。

综上,process_control_timeout可以理解为master进程留给worker进程结束自己的时间,要是到时间worker还没搞定那就开始master自己的策略了。

五、request_terminate_timeout、request_slowlog_timeout

因为request_terminate_timeoutrequest_slowlog_timeout 联系比较密切,所以放在一起来讲。

php-fpm.conf 解释
request_terminate_timeout

; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the 'max_execution_time' ini option
; does not stop script execution for some reason. A value of '0' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0

翻译:执行一个请求的超时时间,在这之后worker进程将被终止。这个选项应该被用在max_execution_time 这个ini选项由于某些原因不能停止脚本执行的时候。

request_slowlog_timeout

; The timeout for serving a single request after which a PHP backtrace will be
; dumped to the 'slowlog' file. A value of '0s' means 'off'.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0

翻译:执行一个请求的超时时间,在这之后一个PHP的backtrace会被输出到slowlog文件里。

分析

request_slowlog_timeoutrequest_terminate_timeout 用在master进程的心跳检测中(fpm_pctl_heartbeat()),心跳时间heartbeat 简化后的算法

  • 在开启request_terminate_timeout情况下:request_terminate_timeout/1000*3

  • 在未开启request_terminate_timeout情况下:request_slowlog_timeout/1000*3 或者 0

  • request_terminate_timeout >= request_slowlog_timeout

第三条规则是为了保证slowlog不影响到正常的请求,heartbeat 取超时时间的1/3应该是为了避免心跳检测过于频繁,因为每次心跳检测都需要遍历所有worker进程。

如果超时事件发生了,那么将直接kill掉worker进程,kill(child_pid, SIGTERM); ,之后内核回收资源关闭client_SocketNginx返回502错误给浏览器。

以上就是“PHP文件中怎么配置超时时间”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网PHP编程频道。

--结束END--

本文标题: PHP文件中怎么配置超时时间

本文链接: https://lsjlt.com/news/324297.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • PHP文件中怎么配置超时时间
    今天小编给大家分享一下PHP文件中怎么配置超时时间的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、概要php.ini 和 ...
    99+
    2023-06-29
  • PHP连接超时时间怎么设置
    在我们使用PHP进行网络请求时,有时候我们需要调整连接超时时间来适应不同的网络环境和请求类型。本文将介绍PHP连接超时时间,其原理和设置方法。连接超时时间是指当我们进行网络请求时,如果服务器无法响应请求,那么客户端需要等待多长时间后才会超时...
    99+
    2023-05-14
    php
  • php怎么设置超时等待时间
    在使用 PHP 进行开发时,有时需要执行耗时较长的操作,例如网络请求、数据库查询、文件操作等。在这种情况下,PHP 默认的超时时间可能不足以完成这些操作,导致程序出错。为了解决这个问题,我们需要设置 PHP 的超时等待时间。PHP 的超时等...
    99+
    2023-05-14
  • php怎么设置会话超时时间
    PHP以其易学易用和功能强大的特点,成为了Web开发的标准语言之一。然而,在Web应用程序中,会话超时的问题困扰着很多开发者。会话超时是指当用户一段时间内没有任何操作时,服务端会话会自动过期,会话数据会被清空。在某些情况下,我们希望控制会话...
    99+
    2023-05-14
  • php怎么设置最大超时时间
    在PHP中,可以通过设置php.ini文件中的max_execution_time参数来设置最大超时时间。步骤如下:1. 打开php...
    99+
    2023-08-24
    php
  • Feign超时在yml文件里怎么配置
    这篇文章主要介绍“Feign超时在yml文件里怎么配置”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Feign超时在yml文件里怎么配置”文章能帮助大家解决问题。Feign超时 yml文件配置rib...
    99+
    2023-07-02
  • php怎么改变超时时间
    随着业务发展,网站访问量越来越大,很多时候我们需要执行较长时间的 PHP 脚本。但是 PHP 默认的超时时间仅为 30 秒,远远无法满足业务需要。为了解决这个问题,我们需要对 PHP 的超时时间进行修改。下面是一些可以改变 PHP 超时时间...
    99+
    2023-05-14
  • php.ini怎么设置超时时间
    本教程操作环境:windows7系统、PHP7.1版,DELL G3电脑php.ini 中缺省的最长执行时间是 30 秒,这是由 php.ini 中的 max_execution_time 变量指定,倘若你有一个需要颇多时间才能完成的工作,...
    99+
    2021-08-07
    php.ini 超时时间
  • Jenkins中怎么设置构建超时时间
    在Jenkins中设置构建超时时间可以通过以下步骤实现: 打开Jenkins的管理界面,在左侧导航栏中选择"系统管理&...
    99+
    2024-03-04
    Jenkins
  • redis怎么设置hash超时时间
    Redis中的hash类型是没有超时时间的,但是可以通过设置hash中每个field的值为一个带有超时时间的字符串或者其他数据类型来...
    99+
    2023-09-01
    redis
  • mysql 中怎么设置事务锁超时时间
    mysql 中怎么设置事务锁超时时间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Mysql数据库采用InnoDB模式,默认参数:innodb...
    99+
    2024-04-02
  • php如何设置会话超时时间
    这篇文章主要介绍“php如何设置会话超时时间”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“php如何设置会话超时时间”文章能帮助大家解决问题。什么是PHP会话PHP会话是一个用于在服务端存储数据的机...
    99+
    2023-07-06
  • PHP连接超时时间如何设置
    本篇内容主要讲解“PHP连接超时时间如何设置”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“PHP连接超时时间如何设置”吧!连接超时时间是指当我们进行网络请求时,如果服务器无法响应请求,那么客户端...
    99+
    2023-07-05
  • php如何设置超时等待时间
    本文小编为大家详细介绍“php如何设置超时等待时间”,内容详细,步骤清晰,细节处理妥当,希望这篇“php如何设置超时等待时间”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。在使用 PHP 进行开发时,有时需要执行耗...
    99+
    2023-07-05
  • mysql怎么设置session的超时时间
    本篇内容介绍了“mysql怎么设置session的超时时间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • mysql事务超时时间怎么设置
    在MySQL中,事务超时时间是由两个参数控制的:innodb_lock_wait_timeout和innodb_rollback_o...
    99+
    2023-10-26
    mysql
  • jdbc怎么设置连接超时时间
    在JDBC中,可以使用`java.sql.Statement`或`java.sql.Connection`对象的`setQueryT...
    99+
    2023-10-27
    jdbc
  • oracle事务超时时间怎么设置
    在Oracle数据库中,事务超时时间可以通过设置以下两个参数来进行控制: DISTRIBUTED_LOCK_TIMEOUT:这个...
    99+
    2024-04-20
    oracle
  • springboot配置mybatis的sql执行超时时间怎么解决
    这篇“springboot配置mybatis的sql执行超时时间怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“spr...
    99+
    2023-07-04
  • MyBatis中怎么设置SQL语句的超时时间
    在MyBatis中,可以通过在<select>, <insert>, <update>...
    99+
    2024-05-08
    MyBatis
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作