Opencart注册需要很长时间
Opencart registration takes extremely long
我刚刚在我的服务器上为我的一个客户安装了一个 OpenCart 系统(服务器是 Debian Wheezy,带有 Nginx、PHP 和 MariaDB)。一切正常,除了一件事。当客户尝试注册时,注册会花费大量时间,大约需要 3 分钟。我已经追踪到这个问题,它很可能在向客户和管理员发送电子邮件时挂起。
我在使用 SSMTP 的服务器上处理电子邮件,而 SSMTP 又使用我自己的电子邮件服务器。 Joomla 等其他网络应用程序工作正常,电子邮件立即发送,没有任何延迟(与系统中的邮件命令相同)。 Opencart设置为"mail"(我什至尝试直接输入SMTP到opencart,但它不起作用)。
由于我对 OpenCarts 的内部工作原理基本一无所知,有经验的人可以帮我解决这个问题吗?
提前致谢!
编辑:
我已经能够成功地找出问题的根本原因。这根本不是 PHP 或 OpenCart 的问题,而是一个系统问题。 php.ini中sendmail路径的设置被注释掉了,也就是说PHP试图自己找。出于某种原因,在 OpenCart 的情况下,它选择了 sSMTP。由于 sSMTP 是同步的,因此等待它完成需要很长时间。另一方面,Joomla 去了 Heirloom mailx,因为一些旧的依赖项(我不知道为什么)而被遗忘在我的服务器上,并且邮件命令立即退出,因此没有延迟。
经过数小时的调试和试错,我的解决方案是完全废弃 ssmtp 和 mailx,并使用 postfix 将邮件中继到外部服务器。现在一切正常。
我将概括一下 - 如何根本原因导致复杂 PHP 系统中的性能问题。
按照以下步骤操作:
- 安装XdebugPHP扩展
- 配置Xdebug的profiler (
profiler_enable
or profiler_enable_trigger
, profiler_output_path
等)
- 导航到在浏览器中速度较慢的页面并加载它(如果设置了
profiler_enable
,将为每个请求创建配置文件,如果它不是' t 设置和 profiler_enable_trigger
设置只需将 XDEBUG_PROFILE
参数添加到 URL)
- 导航到您配置
profiler_output_path
的目录并 在某些 GUI 工具中打开探查器输出文件(参见 this answer)
- 检查哪个函数调用花费的时间最多(一个函数调用可能只需要 5 毫秒,但如果它在单次执行期间被调用 1000 次,则总共需要 5 秒 - 你应该在 GUI 工具中查看所有这些信息)
备注:
- 你不应该在生产服务器上启用 Xdebug(它会减慢执行速度)
- 如果其他人可以访问您的应用程序,请不要启用
profiler_enable
,而是启用 profiler_enable_trigger
,这样您就可以控制触发分析的请求(分析器输出文件可能非常大)
我刚刚在我的服务器上为我的一个客户安装了一个 OpenCart 系统(服务器是 Debian Wheezy,带有 Nginx、PHP 和 MariaDB)。一切正常,除了一件事。当客户尝试注册时,注册会花费大量时间,大约需要 3 分钟。我已经追踪到这个问题,它很可能在向客户和管理员发送电子邮件时挂起。
我在使用 SSMTP 的服务器上处理电子邮件,而 SSMTP 又使用我自己的电子邮件服务器。 Joomla 等其他网络应用程序工作正常,电子邮件立即发送,没有任何延迟(与系统中的邮件命令相同)。 Opencart设置为"mail"(我什至尝试直接输入SMTP到opencart,但它不起作用)。
由于我对 OpenCarts 的内部工作原理基本一无所知,有经验的人可以帮我解决这个问题吗?
提前致谢!
编辑:
我已经能够成功地找出问题的根本原因。这根本不是 PHP 或 OpenCart 的问题,而是一个系统问题。 php.ini中sendmail路径的设置被注释掉了,也就是说PHP试图自己找。出于某种原因,在 OpenCart 的情况下,它选择了 sSMTP。由于 sSMTP 是同步的,因此等待它完成需要很长时间。另一方面,Joomla 去了 Heirloom mailx,因为一些旧的依赖项(我不知道为什么)而被遗忘在我的服务器上,并且邮件命令立即退出,因此没有延迟。
经过数小时的调试和试错,我的解决方案是完全废弃 ssmtp 和 mailx,并使用 postfix 将邮件中继到外部服务器。现在一切正常。
我将概括一下 - 如何根本原因导致复杂 PHP 系统中的性能问题。
按照以下步骤操作:
- 安装XdebugPHP扩展
- 配置Xdebug的profiler (
profiler_enable
orprofiler_enable_trigger
,profiler_output_path
等) - 导航到在浏览器中速度较慢的页面并加载它(如果设置了
profiler_enable
,将为每个请求创建配置文件,如果它不是' t 设置和profiler_enable_trigger
设置只需将XDEBUG_PROFILE
参数添加到 URL) - 导航到您配置
profiler_output_path
的目录并 在某些 GUI 工具中打开探查器输出文件(参见 this answer) - 检查哪个函数调用花费的时间最多(一个函数调用可能只需要 5 毫秒,但如果它在单次执行期间被调用 1000 次,则总共需要 5 秒 - 你应该在 GUI 工具中查看所有这些信息)
备注:
- 你不应该在生产服务器上启用 Xdebug(它会减慢执行速度)
- 如果其他人可以访问您的应用程序,请不要启用
profiler_enable
,而是启用profiler_enable_trigger
,这样您就可以控制触发分析的请求(分析器输出文件可能非常大)