Как установить таймер на скрипт php, вывести ошибку msg и убить скрипт, если прошло n времени? - PullRequest
0 голосов
/ 23 марта 2012

Это может быть простой вопрос, но я довольно новичок в PHP, и мне трудно разобраться в этом.Итак, немного предыстории - мой скрипт вызывается из веб-приложения, которое позволяет пользователям запускать простые команды на удаленных компьютерах.Например, пользователь может щелкнуть кнопку, чтобы отследить файл журнала на удаленной машине, и он отобразит вывод для пользователя.Теперь, если есть проблема с подключением, и ssh не настроен должным образом на целевом сервере, он может просто зависнуть навсегда, и ssh не истечет.Чтобы отобразить для пользователя более точную ошибку, чем таймауты php или fastCGI, я хочу уничтожить скрипт и отобразить команду, которую пользователь выполнял до истечения тайм-аута.Для простоты, допустим, все мои тайм-ауты для IIS / FastCGI / PHP установлены на 5 минут.Я хочу установить таймер, когда сценарий запускается, и если прошло 4 минуты и 45 секунд, я хочу убить сценарий и отобразить сообщение об ошибке для пользователя, который отображает команду, которую он пытался выполнить, чтобы они могли устранить неполадкивручную.

В коде заглушки / псевдо для простого примера:

function StartTimer(){

//start timer 

}

function RunComand($cmd, $timer, $timeMax){

 //runs user command through ssh library and streams back output.
 $output = sshLib($cmd);

 //this is where i want to do my check on the timer. If run through ssh lib takes too long
 //kill the script and return $cmd to display it to user.

 if ($timer > $timeMax){
     //kill script, output $cmd
 }
 return $output;

}

$cmd = $_GET['cmd']  //get users command
$timer = startTimer();
$timeMax = 285; //285 seconds is 4 min 45 seconds

$results = RunCommand($cmd, $timer, $timeMax);

1 Ответ

2 голосов
/ 23 марта 2012

Вы можете использовать Bunsen , "расширенную, объектно-ориентированную библиотеку выполнения программ для PHP".

Вот пример:

<?php

require 'Bunsen.class.php';

// You should DEFINITELY sanatize the contents of `$_GET['cmd']` !!!
$cmd = $_GET['cmd'];
$timeMax = 285;

$bunsen = new Bunsen;
$bunsen->setTimeout($timeMax);

$exitcode = $bunsen->exec($cmd);

if ($exitcode === -1) {
    trigger_error('Maximum time limit exceeded!', E_USER_ERROR);
}

Вы должны быть ОЧЕНЬ осторожны при запуске произвольных команд, которые любой может просто вставить в строку запроса своего URL. Было бы лучше, если бы у вас было что-то вроде этого:

switch($_GET['cmd']) {
case 1:
    $cmd = 'first command';
    break;
case 2:
    $cmd = 'second command';
    break;
case 3:
    $cmd = 'third command';
    break;
default:
    trigger_error('Not allowed!', E_USER_ERROR);
}

Таким образом, они могут запускать только известные безопасные команды из белого списка.

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