PHP 页面加载问题:PHP 致命错误:超过 30 秒的最大执行时间

Posted

技术标签:

【中文标题】PHP 页面加载问题:PHP 致命错误:超过 30 秒的最大执行时间【英文标题】:PHP Page Load Issue: PHP Fatal error: Maximum execution time of 30 seconds exceeded 【发布时间】:2022-01-23 00:37:18 【问题描述】:

在我的生产环境中,我发现页面需要很长时间才能加载的零星问题。在我们看到的错误日志中:

php Fatal error:  Maximum execution time of 30 seconds exceeded

受影响的行是为用户创建会话的位置。

目录是物理的。目录中有 +350 万个文件。 PHP 会话的垃圾收集设置为 31 天。

问题是零星的,所以我无法触发它。行为是一致的,始终是会话开始需要超过 30 秒才能执行。在此之前的行运行良好,如果我列出会话目录 (ls /var/www/sessions/) 的内容,仅从命令行需要 +45 秒。我认为应用程序监控会很好,但这似乎是系统级别的问题。

我查看了 cloudwatch 指标,但没有发现涉及磁盘读取的瓶颈。

谁能就我们可能遇到的问题以及如何解决这些问题提出建议?

【问题讨论】:

该目录中有多少项?该目录是物理上的本地目录还是本地安装的虚拟目录? 这听起来有点像 PHP 没有清理旧会话 您好 Chris Haas, 目录是物理的。目录中有 +350 万个文件。 PHP 会话的垃圾收集设置为 31 天。 350 万是否与您预期的一个月用户数量一致?除了不清理之外,您可能还有一些东西正在以某种方式创建流氓会话。如果它确实符合您的期望,您可能需要查看N parameter,但请务必阅读所有说明和注意事项。 机器人不会保留会话,因此任何访问的机器人都会为他们访问的每个页面生成一个新文件。对于应用程序监控,是否有您推荐我们使用的工具? 【参考方案1】:

PHP 使用session.gc_probability 偶尔清理会话文件夹。确保在生产环境中将其设置为 0,这样您的 API/页面调用就不会挂起。

我建议检查session.gc_maxlifetime 值,它会给你一些关于文件保存时间的想法。

您可以致电session_gc() 手动强制清理(并可能模拟您的问题),在https://www.php.net/manual/en/function.session-gc.php 上查看更多信息。如果它通过命令行挂起太久,您可能会考虑删除整个会话文件夹(警告:这将杀死所有用户的会话)。

请注意,某些发行版/软件包会自动安装会话垃圾收集 cron 作业,我很久以前就遇到过文件夹中的文件过多而 cron 作业挂起的问题(更多详细信息 https://serverfault.com/questions/511609/why-does-debian-clean-php-sessions-with-a-cron-job-instead-of-using-phps-built)。

作为一个长期的解决方案,我会说放弃基于文件的会话并使用 Redis 来处理会话,尤其是在磁盘性能不是最好的 AWS 上。不确定您使用的是什么框架(大多数现代框架都有内置的解决方案),但您也可以在线找到无框架的解决方案。

【讨论】:

您好 Paulo H。对于应用程序监控,您推荐我们使用的工具吗?

以上是关于PHP 页面加载问题:PHP 致命错误:超过 30 秒的最大执行时间的主要内容,如果未能解决你的问题,请参考以下文章

致命错误:超过 30 秒的最大执行时间 [重复]

致命错误:超过 30 秒的最大执行时间 xampp

致命错误:第 1610 行的 C:\xampp\htdocs\wordpress\wp-includes\class-http.php 中的最大执行时间超过 30 秒

致命错误:第 463 行的 C:\xampp\htdocs\AKS_Shop\wp-includes\Requests\Transport\cURL.php 中的最大执行时间超过 30 秒

致命错误:phpMyAdmin 中的执行时间超过 30 秒

xampp phpmyadmin 致命错误