4

У меня есть PHP-скрипт, который я разрабатывал, который вызывает внешний API в цикле. Он тестируется на VPS, который запускает LAMP на Debian. Сегодня утром я заметил, что API не отвечает на мой сценарий. Когда я позвонил провайдеру, они сказали мне, что мой сервер вызывал API 1000 раз в час в течение последних 10 часов. Я предполагаю, что скрипт php (который я работал днем ранее и тестировал на своем VPS) вошел в бесконечный цикл во время одного из выполнений и никогда не выходил (я тестировал его из командной строки, и не через Интернет.) Я попытался остановить и запустить Apache, но персонал службы поддержки API говорит, что звонки все еще поступают с моего адреса сервера. Как я могу найти и остановить процесс? Кроме того, существует ли вероятность того, что остановка / запуск Apache решила проблему, но API все еще пытается разобраться в прошлых вызовах?

Пожалуйста, прости меня за неправильное использование моей локальной тестовой среды.

Изменить: я не знаю имя процесса, мне нужно узнать имя (или pid) на основе поведения.

2 ответа2

11

Поскольку вы вручную запускали бинарный файл php, используя php или phb shebang в верхней части скрипта, вам нужно найти его PID и убить его.

Вы можете использовать pkill -9 php или, если pkill его нет, вы можете использовать ps -efw | grep php | grep -v grep | awk '{print $2}' | xargs kill чтобы убить все процессы php.

Кроме того, если процесс устанавливает исходящие сетевые подключения к внешнему API, эти подключения будут отображаться в netstat.

Вы должны быть в состоянии сделать netstat -anop чтобы показать вам все соединения и PID процесса, который их контролирует. Узнайте IP/ имя хоста внешнего сервера API, найдите этот IP/ имя хоста в списке netstat, убейте связанный PID.

1

Если я правильно понял ваш пост, вы запустили скрипт из PHP-CGI через консоль, что он, вероятно, что-то пошло не так и спамит серверы API.

Так что есть много возможностей, которые могут вызвать эту проблему. Прежде всего, когда вы выполняете PHP-скрипт, просто купите «php scriptname.php», он ждет завершения PHP-скрипта и затем возвращается к вашему основному вводу сеанса. Если вы закроете свою оболочку во время выполнения скрипта, он остановит свою работу. Если вы не запустили свой PHP с "screen" или «&», у скрипта не будет единой возможности продолжить работу.

Теперь давайте проанализируем его работу. Если скрипт переходит в бесконечный цикл, открывая сокет, это означает, что он будет пытаться подключиться к серверу API примерно сто раз в секунду. Это означает, что целевой сервер должен забанить вас с первых 10 секунд. То, что вы не разъяснили нам, это поток запросов на соединение с целевым сервером. Предоставляет ли служба поддержки API дополнительную информацию об этом? И если да, что они сказали.

Сказав, что ваш VPS по-прежнему отправляет запросы на серверы, я бы предложил вам сделать

ps -A xa | grep php

и проверьте наличие запущенных экземпляров php. Вы можете случайно запустить php-скрипт в фоновом режиме, добавив & в конце строки. Если эта команда вернет что-то. Найдите pid приложения и завершите его с помощью следующей команды

убить -9 пид

Если это не сработает, перезапустите vps и спросите их, отправляет ли он им запросы на соединение (что сейчас невозможно, и это будет означать, что их брандмауэр переводит ваши пакеты в медленный режим (это означает, что он помещает их в очередь с задержкой на их серверы ))

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .