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 秒的最大执行时间的主要内容,如果未能解决你的问题,请参考以下文章
致命错误:第 1610 行的 C:\xampp\htdocs\wordpress\wp-includes\class-http.php 中的最大执行时间超过 30 秒
致命错误:第 463 行的 C:\xampp\htdocs\AKS_Shop\wp-includes\Requests\Transport\cURL.php 中的最大执行时间超过 30 秒