2016-06-03 18 views
0

Ich brauche eine Funktion, die eine abfangbare Ausnahme auslösen wird, nachdem eine aufrufbare Funktion zu lange benötigt, um ihre Aufgabe abzuschließen.Begrenzen Sie die Ausführungszeit eines aufrufbaren in PHP

Hinweis: Ich beziehe mich nicht auf die maximale Ausführungszeit für ein PHP-Skript.

Die Funktion sollte funktionieren wie die call_user_func, außer dass es ein Zeitlimit in Sekunden für die aufrufbaren dauert.

function task() { 
     // does a lot of work... 
    } 

    try { 
     call_user_func('task', 30); // limit to 30 seconds 
    } catch (TimeoutException $ex) { 
     // .... 
    } 

Ich kann nicht benutzerdefinierte Logik zur task Funktion hinzufügen, eine Ausnahme zu werfen, auf seine eigenen. Die Idee ist Force die aufrufbaren Methoden zum Abbrechen oder Fehlschlagen nach X Anzahl von Sekunden.

Ich habe CLI-Skripte, die ich regulieren möchte, wie lange sie dauern, um eine Aufgabe abzuschließen.

+1

[Diese Frage] tun, dass (http://stackoverflow.com/questions/70855/how-can-one-use-multi-threading-in-php-applications) könnte Ihnen einige Hinweise geben. Die Implementierung eines eigenen Schedulers ist jedoch keineswegs trivial, viele Randfälle müssen generell berücksichtigt werden. – ccKep

Antwort

0

Sie könnten EvTimer verwenden. Allerdings müssen Sie das Ev-Paket installieren, da es nicht Teil von PHP ist. Sie können mit installieren PECL ev

<?php 

     function task(){ 
      // DOES A LOT OF WORK... 
     } 

     function runTaskWithin($seconds) { 
      // SET UP A TIMER TO FIRE AFTER X-SECONDS 
      $evT = new EvTimer($seconds, 0, function ($seconds) { 
       throw(new Exception("{$seconds} Seconds has elapsed since Execution began... Better rest, Now.")); 
      }); 
     } 

     // ONCE 30 SECONDS PASSES A NEW EXCEPTION WILL BE THROWN... 
     // NON-BLOCKING... 
     try { 
      runTaskWithin(30); // LIMIT TO 30 SECONDS 
     } catch (Exception $ex) { 
      // .... 
     } 
+1

1) OP erwähnt, er kann die Task-Methode nicht bearbeiten 2) Durch die Beispiele in den PHP-Dokumenten sieht es aus wie EvTimer ist eine blockierende Funktion. Was bedeutet, dass Ihr Beispiel würde immer nur 30 Sekunden schlafen und eine Ausnahme auslösen? – ccKep