2012-03-23 2 views
0

Dies könnte eine einfache Frage sein, aber ich bin ziemlich neu in PHP und habe eine harte Zeit, dies herauszufinden. Also, ein kleiner Hintergrund - mein Skript wird von einer webbasierten App aufgerufen, mit der Benutzer einfache Befehle auf entfernten Rechnern ausführen können. Beispiel: Der Benutzer kann auf eine Schaltfläche klicken, um eine Protokolldatei auf einem Remotecomputer zu erfassen, und die Ausgabe wird dem Benutzer angezeigt. Nun, wenn es ein Verbindungsproblem gibt und ssh auf dem Zielserver nicht richtig konfiguriert ist, kann es einfach für immer hängen bleiben und der ssh wird kein Zeitlimit überschreiten. Um dem Benutzer einen besseren Fehler als die Timeouts php oder fastCGI anzuzeigen, möchte ich das Skript beenden und den Befehl anzeigen, den der Benutzer ausgeführt hat, bevor die Zeitüberschreitungen auftreten. Zur Vereinfachung sagen wir, dass meine Timeouts für IIS/FastCGI/PHP alle auf 5 Minuten eingestellt sind. Ich möchte einen Timer setzen, wenn das Skript gestartet wird, und wenn 4 Minuten und 45 Sekunden vergangen sind, möchte ich das Skript beenden und dem Benutzer eine Fehlermeldung anzeigen, die den Befehl anzeigt, den sie ausführen wollten, damit sie Fehler beheben können manuell.Wie setze ich einen Timer für ein PHP-Skript, gebe die Fehlermeldung aus und kille das Skript, wenn die Zeit abgelaufen ist?

In Stummeln/Pseudo-Code für ein einfaches Beispiel:

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); 

Antwort

2

Sie Bunsen verwenden könnten "eine fortschrittliche, objektorientierte Programmausführung Bibliothek für PHP".

Hier ist ein Beispiel:

<?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); 
} 

Sie sollten sehr vorsichtig sein, um beliebige Befehle ausgeführt, dass jemand nur in der Abfragezeichenfolge ihrer URL setzen könnte. Es wäre besser, wenn Sie so etwas wie dies haben:

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); 
} 

So können sie nur bekannte sichere Befehle von einer weißen Liste ausführen können.

+0

genial, das ist perfekt. Ich akzeptiere den Cmd-Parameter aus der Abfragezeichenfolge nicht, ich habe das nur als Beispiel verwendet. Bekannte sichere Kommandos werden dynamisch aus Werten erstellt, die in den Config-Tabellen gespeichert sind, basierend auf Optionen, die der Benutzer auswählt. Nur sichere Befehle können ausgeführt werden, und entweder sende ich das cmd per Post an das Skript oder rufe es direkt auf und übermittle den Cmd als Parameter. Danke für die Warnung, und die ausgezeichneten Beispiele! Ich hatte begonnen, eine schnelle Lösung mit pcntl_fork() zu schreiben, aber das wird mir Zeit sparen. Danke noch einmal. – user797963

Verwandte Themen