2012-03-01 11 views
7

Jak obsługiwać CTRL + C w PHP w linii poleceń? Funkcje Pcntl_* nie działają w systemie Windows.PHP CLI w Windows: obsługa poleceń Ctrl-C?

+0

co próbujesz osiągnąć? –

+0

Brak systemu Windows do testowania, być może ['w32api_register_function'] (http://www.php.net/manual/en/function.w32api-register-function.php) z [' SetConsoleCtrlHandler'] (http: // msdn. microsoft.com/en-us/library/windows/desktop/ms686016(v=vs.85).aspx), ale to jest szalenie domysły ... i prawdopodobnie błędne. – Wrikken

+0

@Dagon Potrzebuję mojego skryptu, aby coś zrobić, gdy go przerywam. Na przykład pisz w pamięci xml dom do pliku, zanim wyjdziesz. – x74x61

Odpowiedz

0

Jeśli chcesz uruchomić zadanie w PHP za pomocą wiersza poleceń, które zajmuje bardzo dużo czasu, spróbuję zorganizować to w odznaki i śledzić to, co już zostało zrobione.

Teraz możesz całkowicie przetworzyć każdy znaczek (np. Proces, a następnie zapisać go w pliku xml), a nie tylko po przetworzeniu całej listy. Tak więc awaria/zatrzymanie się pomiędzy nimi anuluje tylko jedną odznakę, a nie wszystkie.

Jeśli przechowujesz swoją aktualną pozycję po każdym odznaczeniu, możesz łatwo wznowić działanie po zawieszeniu się skryptu lub jego zatrzymaniu.

Teraz, jeśli sprawdzisz listę procesów systemu operacyjnego, aby sprawdzić, czy skrypt jest uruchomiony, możesz napisać zadanie cron, które uruchamia skrypt co X minut, jeśli uległo awarii i nie było jeszcze uruchomione.

Więc TL; DR

  • praca procesowe w małych odznaki
  • Zapisz pozycję ostatniego pomyślnie przetworzone odznaki
  • Sprawdź, czy już proces uruchomiony na początku
  • Stale uruchomić skrypt, aż wszyscy są szczęśliwi !

Poza tym lubię PHP dla małych zadań wiersza poleceń, ale jeśli masz tak duże zadanie, coś innego może być lepiej dopasowane. Sprawdź, co może być stabilne przez długi czas i może pokazać postęp. Może mała aplikacja C# z minimalistycznym gui.

+0

To może nie być rozwiązanie CtRL + C, którego szukasz, ale jest to działające rozwiązanie. Mam wielką wątpliwość, czy PHP może obsłużyć przerwanie procesu! Możesz jednak spróbować szczęścia z "register_shutdown_function" – ToBe

+0

No cóż, istnieje pcntl_signal, ale to tylko dla systemów uniksowych. –