我正在开发一个 php 脚本,该脚本在循环中调用外部 api。它正在运行 Debian 上的 LAMP 的 VPS 上进行测试。今天早上我注意到 api 没有响应我的脚本。当我打电话给提供商时,他们告诉我,在过去的 10 个小时里,我的服务器每小时调用 api 1000 次。我假设一个 php 脚本(我前一天一直在使用它,并在我的 VPS 上测试它)在一次执行过程中进入了无限循环,并且再也没有出来(我一直在命令提示符下测试它,而不是通过网络。)我试图停止并启动 Apache,但 api 支持人员说调用仍然来自我的服务器地址。我如何找到并停止该过程?此外,Apache 停止/启动是否可能解决了问题,但 api 仍在尝试对过去的调用进行排序?
请原谅我没有正确使用我的本地测试环境。
编辑:我不知道进程名称,我需要根据行为来发现名称(或pid)。
答案1
由于您手动运行 php 二进制文件(无论是通过使用 php 还是使用脚本顶部的 php shebang),您都需要找到它的 PID 并将其终止。
您可以使用pkill -9 php
,或者如果 pkill 不存在,您可以使用它ps -efw | grep php | grep -v grep | awk '{print $2}' | xargs kill
来终止所有 php 进程。
此外,如果某个进程正在与外部 API 建立传出网络连接,那么这些连接将显示在 netstat 中。
您应该能够执行 anetstat -anop
来显示所有连接以及控制它们的进程的 PID。找出外部 API 服务器的 IP/主机名,在 netstat 列表中找到该 IP/主机名,然后终止相关 PID。
答案2
如果我正确理解了您的帖子,那么您通过控制台运行了一个 PHP-CGI 脚本,它可能出了问题并向 API 服务器发送了垃圾邮件。
因此,有很多原因可能导致此问题。首先,当您执行 PHP 脚本时,只需输入“php scriptname.php”,它就会等待 PHP 脚本结束,然后返回到主会话输入。如果您在脚本执行期间关闭 shell,它将停止其操作。除非您使用“screen”或“&”启动 PHP,否则脚本不可能继续运行。
现在让我们分析一下它的运行。如果脚本进入无限循环,打开套接字,这意味着它将每秒尝试连接 API 服务器数百次。这意味着目标服务器应该在前 10 秒禁止您。您尚未向我们说明的是,连接请求到目标服务器的流量。API 支持是否为您提供了有关此问题的更多信息?如果是,他们说了什么。
尽管如此,你的 VPS 仍然向服务器发送请求,我建议你这样做
ps -A xa | grep php
并检查正在运行的 php 实例。您可能意外地通过在行尾添加 & 在后台启动了 php 脚本。如果此命令返回某些内容。查找应用程序的 pid,并使用以下命令终止它
杀死-9 pid
如果这不起作用,请重新启动您的 vps 并询问他们是否仍向他们发送连接请求(目前这是不可能的,这意味着他们的防火墙将您的数据包置于慢速模式(意味着它将它们排队并延迟到他们的服务器))