解决由于内部 curl 调用无响应端点而导致 PHP 应用程序卡住的最佳实践

解决由于内部 curl 调用无响应端点而导致 PHP 应用程序卡住的最佳实践

最近我发现我的一个网站(Centos PHP-FPM /Apache / MySql 机器上的 Prestashop 电子商务)瘫痪了并且无法响应网络请求。

经过调查,问题是由于使用 php-curl 对暂时离线的端点进行的 API 调用导致的,该调用位于网站所有页面中调用的应用程序 PHP 文件内。

错误地进行了 cURL 调用,但没有设置 CURLOPT_TIMEOUT_MS,因此访问我网站的用户迅速填满了最大 php 连接数,阻塞了 php-fpm 进程,并阻止我的服务器接收其他传入连接。

我想知道如果再次发生这种情况,是否可以从终端“在生产中”快速有效地防止/识别此类问题(特别是快速了解哪个是被阻止的端点或识别生成阻止服务器的脚本的文件),因为在我的情况下,我必须在“应用程序级别”而不是从服务器检查问题,因为:

  • 启动“top”服务器会显示被阻止的 php-fpm 进程列表,而没有任何其他信息来了解问题(此外,由于连接卡住几乎没有活动,因此服务器平均负载约为 0.00)。
  • 启动“netstat -nputw”向我展示了许多处于 TIME_WAIT 状态的内部连接,但仍然没有关于中断“罪魁祸首”的信息(我可以使用 netstat 或类似的网络命令看到 php-curl 调用的端点吗?)
  • 启动 php-fpm 进程的“strace”后,我看到了很多相关文件,但这并没有什么帮助,因为该站点的流量一般,打开了几十个文件。
  • 网络服务器日志仅通知我与网络资源的连接超时,但没有通知包含有问题的 cURL 调用的脚本。

感谢您的帮助。

相关内容