2 votes

Saisir le temps d'exécution et passer à l'élément suivant si l'exécution est trop longue.

Je me demandais simplement s'il était possible de détecter le timing d'exécution actuel d'un script en cours d'exécution, je suis en train de créer une application pour envoyer un ping à certains ordinateurs sur le réseau. Comme cela est fait à partir d'une machine Linux, le système de ping diffère de celui de Windows.

Sur une machine linux, si l'ordinateur est éteint, le serveur se bloque sur le message primaire après avoir lancé la commande ping et n'a plus de sortie. Il se bloquera simplement (d'après mon expérience du ping sous linux).

Donc j'ai ce script :

$Computer_Array = array( 
  "Managers" => "192.168.0.5",
  "Domain Controller" => "192.168.0.1"
  "Proxy Controller" => "192.168.0.214"
);
foreach ($Computer_Array AS $Addresses){ 
  exec('ping'.$Addresses, $Output);
}

Plus tard, cela sera utilisé pour afficher des statistiques Le problème, c'est que l'ordinateur du manager est soumis à la fois à des conditions d'alimentation telles que l'humidité et la chaleur. sur o off quand on lance la commande ping, ça ne marche pas Je me demande donc s'il y a une méthode pour capturer les données de la commande microtime(); de la fonction en cours d'exécution, si elle dépasse un seuil, on passe à l'élément suivant. Je préférerais que cela reste dans le noyau de PHP, mais si cette solution ne peut être réalisée que via AJAX ou un autre langage, alors je devrais consulter le développeur pour savoir s'il est possible d'intégrer une méthode externe.

1voto

Jack Points 88446

Le site ping vous permet de spécifier combien de temps il attendra avant d'abandonner :

ping -c 5 -t 1 127.0.0.2

Ce message sera renvoyé après une seconde, quel que soit le nombre de pings envoyés. Les arguments exacts de la ligne de commande varient selon les plateformes.

Sinon, si vous pouvez utiliser pcntl regardez dans pcntl_alarm() il délivrera un SIGALRM signal à votre application après un certain temps qui peut être capté.

Enfin, et je ne l'ai pas testé moi-même, vous pourriez essayer d'utiliser proc_open() et utiliser stream_select() sur l'un des tuyaux ; si rien ne s'est passé sur le tuyau après un certain temps, vous pouvez alors tuer le processus.

0voto

Mahdi.Montgomery Points 1061

Si vous voulez faire cela avec PHP, ou si vous rencontrez un problème similaire, voici un exemple en utilisant le code de l'application php exécute un processus en arrière-plan

Le script PHP script aurait besoin de droits d'écriture sur les fichiers de sortie. Ce concept fonctionnerait essentiellement pour n'importe quoi, d'un ping à un autre script PHP.

function isRunning($pid){
    try{
        $result = shell_exec(sprintf("ps %d", $pid));
        if( count(preg_split("/\n/", $result)) > 2){
            return true;
        }
    }catch(Exception $e){}

    return false;
}

$cmd = "ping 127.0.0.1";
$outputfile = "output";
$pidfile = "pid";

$start = microtime(true);

// Don't last longer than 10 seconds
$threshold = 2;

// Ping and get pid
exec(sprintf("%s > %s 2>&1 & echo $! > %s", $cmd, $outputfile, $pidfile));
$pid = `tail -n 1 $pidfile`;

// Let the process run until you want to stop it
while (isRunning($pid)){

    // Check output here...

    if ((microtime(true)-$start) > $threshold){
        $o = `kill $pid`;
        die("Timed out.");
    }
}

$end = microtime(true);
$time = $end - $start;

echo "Finished in $time seconds\n";

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X