2011-09-27 18 views
8

Mogę powiedzieć, że moje pytanie jest związane z PHP, ale to, co mnie bardziej interesuje, to właściwa logika programowania w sytuacji, w której wykonywanie funkcji może trwać przez czas nieokreślony.Wykonywanie funkcji limitu czasowego w PHP lub cokolwiek innego

Jaki jest właściwy sposób monitorowania czasu potrzebnego do wykonania niektórych funkcji i jak zatrzymać to wykonanie i kontynuować pracę z resztą programu?

OK, wiem, że na przykład istnieje funkcja set_time_limit(), która zwraca błąd krytyczny, ale nie chcę tego, chcę, aby mój kod był kontynuowany po x sekundach, lub może po przekroczeniu czasu rzucił wyjątek, złapać i zrobić coś innego?

Czy pisze coś w rodzaju funkcji "watchdog" i jak to się robi?

Dziękuję za pomoc, którą można podać, za każdy link, jakikolwiek artykuł, który rozwiązuje ten problem w sposób "powinien" zostać zrobiony.

BR, Newman

+1

Jaki jest kontekst, a dokładniej? Zgaduję, że funkcja zawiera jakąś pętlę. Jeśli to prawda, mój pierwszy instynkt byłoby wziąć znacznik czasu z 'microtime()' przed wejściem do pętli, a następnie porównać ten znacznik czasu z jednym, który jest generowany wewnątrz pętli przy każdej iteracji. Po osiągnięciu określonej wartości możesz rzucić wyjątek lub zrobić cokolwiek innego. Może ja źle interpretowane kontekście tego, co staramy się robić, choć. Czy szukasz czegoś, co można łatwiej zastosować do wielu funkcji? – Pete171

+0

tak, coś takiego.moim problemem jest to, że jedna z moich funkcji próbuje telnetować się na inne urządzenie, a czasami limit czasu telnetu jest długi. – newman555p

Odpowiedz

3

PHP nie dają ogólny sposób na timeout funkcję. Ale wiele składników, w których ten problem jest wspólny, pozwala zdefiniować limit czasu.

Przykłady:

  • The HTTP Stream Wrapper pozwala określić timeout opcję:

    file_get_contents('http://example.com', false, stream_context_create(
        array('http' => array('timeout' => 10 /* seconds */)) 
    )); 
    
  • PDO (baza warstwa abstrakcji) pozwala ustawić limit czasu przy użyciu PDO::ATTR_TIMEOUT attribute (zauważ, że ten atrybut może oznaczać różne rzeczy z różnymi sterownikami bazy danych):

    $pdo->setAttribute(PDO::ATTR_TIMEOUT, 10 /* seconds */); 
    
  • Można ustawić limit czasu połączenia podczas korzystania FTP:

    $ftp = ftp_connect('example.com', 21, 10 /* seconds */) 
    

Podobnie wszystkie inne rozszerzenia, które uzyskują dostęp do zasobów zdalnych potencjalnie zapewni takie parametry limitu czasu lub opcji.

0

W PHP, w szczególności, nie sądzę masz poprawny sposób kontrolować czas wykonania swoich funkcji spoza nich. Tak jak powiedziałeś, rzeczy takie jak set_time_limit rzucają Fatar Error i zabijają twój skrypt.

Sugerowałabym, aby zmierzyć czas wyłączenia z funkcji, używając rzeczy takich jak microtime() i wyrzucić wyjątek, jeśli limit czasu zostanie przekroczony; wyjątek, który będzie można złapać na zewnątrz i kontynuować działanie zgodnie z tym.

+0

OK, spróbuję jak ty. ale w jaki sposób problem ten jest rozwiązywany ogólnie (nie w PHP)? – newman555p

+0

Myślę, że to zależy od języka, którego używasz. Niektóre z nich jak Earlang pozwalają programiście dołączyć proces razem, umożliwiając im wzajemne monitorowanie. Nie wiem, czy istnieje standardowa technika radzenia sobie z tym scenariuszem, ale jeśli tak, proszę skomentuj, podając mi nazwę :) – Deleteman

Powiązane problemy