Подтвердить что ты не робот

Как остановить PHP скрипт на фоновом

Я начал этот процесс (time.php)

<?php

ignore_user_abort(true); // run script in background
set_time_limit(0);       // run script forever 
$interval = 300;         // do every 1 minute...
do
{ 
    // add the script that has to be ran every 1 minute here
    // ...

    $to      = "[email protected]";
    $subject = "Hello Richie";
    $header  = "From: [email protected]";
    $body    = "Hello Richard,\n\n"
             . "I was just testing this service\n\n "
             . "Thanks! ";

    mail($to, $subject, $body, $header);

    sleep($interval); // wait 5 minutes

} while(true); 
?>

но теперь я хочу остановить его. Он отправляет сотни писем в мой Gmail a/c. Это на веб-сервере, где я не могу перезапустить его, чтобы убить процесс.

Есть ли способ выполнить другой файл, чтобы убить процесс или как мне это сделать?

4b9b3361

Ответ 1

Если у вас нет доступа к оболочке, тогда единственный способ - попросить администратора сервера убить процесс.

Как сказано, есть простой способ настроить script и разрешить его отмену из любого другого script на том же сервере, как показано ниже:

<?php
// at start of script, create a cancelation file

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','run');

// inside the script loop, for each iteration, check the file

if ( file_get_contents(sys_get_temp_dir().'/myscriptcancelfile') != 'run' ) { 
    exit('Script was canceled') ; 
}

// optional cleanup/remove file after the completion of the loop

unlink(sys_get_temp_dir().'/myscriptcancelfile');

// To cancel/exit the loop from any other script on the same server

file_put_contents(sys_get_temp_dir().'/myscriptcancelfile','stop');

?>

Ответ 2

Я предполагаю, что у вас нет доступа к оболочке. Я подозреваю, что самый простой способ - связаться с администратором и перезапустить Apache. Они не хотят, чтобы этот бег больше, чем вы.

Один из вариантов мог бы попытаться уничтожить все процессы Apache с помощью PHP. Он отправит сигнал об удалении всем процессам Apache, за исключением того, на котором он работает. Это может работать, если процесс Apache работает под общим процессом без setuid(). Попытайтесь на свой страх и риск.

<?php
$cpid = posix_getpid();
exec("ps aux | grep -v grep | grep apache", $psOutput);
if (count($psOutput) > 0)
{
    foreach ($psOutput as $ps)
    {
        $ps = preg_split('/ +/', $ps);
        $pid = $ps[1];

        if($pid != $cpid)
        {
          $result = posix_kill($pid, 9); 
        }
    }
}
?>

Ответ 3

Следующее остановит фоновый процесс (PHP):

sudo service apache2 stop

Чтобы снова запустить apache:

sudo service apache2 start

Чтобы просто перезапустить apache:

sudo service apache2 start

Ответ 4

Если вы запустили его в фоновом режиме, используйте ps aux | grep time.php, чтобы получить PID. Тогда просто kill PID. Если процесс запущен на переднем плане, используйте его, чтобы прервать его.

Если процесс запущен в Apache, перезапустите Apache (перезапуск/etc/init.d/apache2 для Debian). Если процесс начался с CGI-подобного сервера, перезапустите сервер.

Ответ 5

Чтобы остановить выполнение сценариев php, вы можете просто ввести следующую команду в своем терминале. Это запустит службу Apache. (окончательный перезапуск службы php).

sudo service apache2 restart

Возможно, вы захотите включить таймаут в свои скрипты в будущем.

Ответ 6

Вы можете убить запущенный процесс apache. Попробуйте запустить что-то вроде apachectl stop, а затем apachectl start, чтобы запустить его. Это убьет ваш сервер в течение определенного периода времени, но также будет следить за тем, чтобы все процессы, застрявшие в этом script, исчезли.