Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP][Windows] Deamony pod Windowsem, Poradnik / przykład odpalania demonów w tle
CuteOne
post 17.05.2011, 17:34:55
Post #1





Grupa: Zarejestrowani
Postów: 2 958
Pomógł: 574
Dołączył: 23.09.2008
Skąd: wiesz, że tu jestem?

Ostrzeżenie: (0%)
-----


Zanim zaczniemy:
----------------------------

Czym jest Deamon - http://pl.wikipedia.org/wiki/Demon_(informatyka)

Do czego, możemy go wykorzystać:
- odbieranie danych ze stron internetowych (np. RSS, XML) i zapis na dysku
- konwertowanie plików .avi na .flv
- zmiana jakości uploadowanych przez użytkowników grafik
- rozsyłanie maili
- obsługa botów do gier

...i wiele, wiele więcej.

Uwaga: Przed przystąpieniem do tworzenia Deamona pod Windowsa, pokazanym tutaj sposobem należy przeczytać "Notkę od autora" znajdującą się na końcu artykułu

Cel:
----------------------------

Utworzenie dwóch Deamonów pracujących równolegle w tle na Windows'ie.


Napotkane problemy:
----------------------------

Windows'owskie "wydanie" PHP nie posiada rodziny funkcji pcntl. Funkcje te umożliwiają między innymi tworzenie klonów procesu (forking) dzięki czemu, możliwe jest odczepianie ich od konsoli systemowej. Innymi słowy uruchamiając deamona nie możemy zamknąć konsolii ponieważ będzie to równoznaczne z zakończeniem działania samego deamona.

Tu z pomocą przychodzi nam obiekt COM - czym on jest i jak go obsługiwać dowiecie się tutaj. A teraz bez zbędnych dyrdymałów...


Wymagania:
----------------------------

- minimum Windows 2000 Professional [sam pracuję na Windows XP Professional sp2]
- zainstalowane PHP w wersji min. 4.1
- prawa administratora [zalogowanie na konto admina]
- stawione Windowsowskiej ścieżki do PHP - poradnik
- skonfigurowany php.ini [tu niestety trzeba kombinować]:
- safe_mode = off
- disable_classes = (usuwamy COM - jeżeli został tu zapisany)


Test obiektu COM:
----------------------------

Najpierw sprawdźmy czy na naszej konfiguracji będziemy mogli utworzyć obiekt COM. Stwórzmy plik test.php a w nim:
  1. <?php
  2.  
  3. error_reporting('E_ALL');
  4.  
  5. $WshShell = new COM("WScript.Shell");
  6.  
  7.  
  8. $cmd = 'notepad.exe';
  9. $oExec = $WshShell->Run("cmd /C $cmd ", 3, false);
  10.  
  11. $WshShell = null;
  12.  
  13. ?>


Zapisujemy plik i odpalamy w przeglądarce. Jeżeli naszym oczom ukaże się notatnik znaczy to, że wszystko gra i możemy przejść dalej inaczej sprawdzamy błędy w konsoli i wracamy do "Wymagań".


Demonizowanie czas zacząć:
----------------------------

W pierwszym kroku utwórzmy trzy pliki bezpośrednio na dysku C (ponieważ są to tylko testy nie ma sensu bawić się ścieżkami do plików):
- init.php odpowiadający za rozruch Deamonów
- demon_create.php skrypt Deamona, który w pętli będzie tworzył pliki .txt
- demon_delete.php skrypt drugiego Deamona, który w pętli będzie usuwał wcześniej powstałe pliki .txt

Do pliku init.php wrzucamy
  1. <?php
  2.  
  3. error_reporting('E_ALL');
  4.  
  5. $WshShell = new COM("WScript.Shell");
  6.  
  7.  
  8. $cmd = 'php demon_create.php';
  9. $oExec = $WshShell->Run("cmd /C $cmd ", 0, false);
  10.  
  11. sleep(5);
  12.  
  13. $cmd = 'php demon_delete.php';
  14. $oExec = $WshShell->Run("cmd /C $cmd ", 0, false);
  15.  
  16. $WshShell = null;
  17.  
  18. ?>


Może zauważyliście, że w poleceniu Run drugi argument został zmieniony na 0? Wszystko po to aby nasze procesy [cmd.exe] uruchomiły się i pracowały w tle.

O wszystkich argumentach dostępnych w funkcji Run przeczytacie tutaj

Jest to konieczne aby po zamknięciu wszystkich linii komend nasze demonki nadal pracowały.

Do pliku demon_create.php wrzucamy
  1. <?php
  2.  
  3. $i = 0;
  4. while(1) {
  5.  
  6. $handler = fopen($i.'.txt', 'w+'); //otwieramy plik $i.txt, jeżeli nie istnieje zostaje utworzony
  7. fclose($handler);
  8. sleep(1);
  9. $i++;
  10. }
  11. ?>



A do pliku demon_delete.php
  1. <?php
  2.  
  3.  
  4. $i = 0;
  5. while(1) {
  6.  
  7. if(file_exists($i.'.txt')) {
  8.  
  9. unlink($i.'.txt');
  10. }
  11. sleep(1);
  12. $i++;
  13. }
  14. ?>

Dzięki wstawieniu sleep(5) do init.php jesteśmy pewni, że jakieś pliki do usunięcia na pewno już powstały.


Uruchamiamy demony:
----------------------------

Do przetestowania naszych demonów włączmy linie komend (Start -> uruchom -> wpisujemy cmd -> zatwierdzamy enterem), następnie do linii komend wpisujemy cd \ dzięki czemu "przerzuca" nas ona bezpośrednio na dysk C. Ostatnim krokiem jest uruchomienie przez php naszego pliku rozruchu init.php w tym celu do linii komend wpisujemy php init.php i czekamy aż skrypt zostanie wykonany do końca [pojawi się możliwość dalszego wpisywania komend]. Zamykamy linie komend

W tym momencie oba demony pracują w tle aby to sprawdzić wchodzimy na dysk C i obserwujemy tworzenie i usuwanie plików .txt.


Mały update:
Po uruchomieniu demonów śmiało możemy zamknąć wszystkie linie komend jakie zostały utworzone poprzez Menadżera zadań(ctrl+alt+delete -> procesy ->zamykamy wszystkie cmd.exe)

Zamykamy demony:
----------------------------

Do zamknięcia demonów używamy Windowsowskiego Menadżera zadań (ctrl+alt+delete) i wyłączamy wszystkie procesy o nazwie php.exe. Zauważycie zapewne, że przy

zamykaniu php.exe zamknięte zostaną również cmd.exe, które je odpaliły.


Refleksje itp..
----------------------------

Przedstawione tutaj demony są no co tu dużo gadać dość prymitywne ale doskonale obrazują w jaki sposób, można odpalić na Windzie równolegle w tle kilka

procesów demona. Zaznaczyć trzeba, że w php istnieją inne funkcje (np. services) umożliwiające uruchamianie demonów ale jakoś nie przypadły mi one do gustu.

Dla programistów, którzy lubią mieć wszystko pod kontrolą polecam przyjrzeć się klasie WMI:
  1. //Otwórz notatnik i odpal ten skrypt
  2. $wmi = new COM('winmgmts://');
  3. $processes = $wmi->ExecQuery("SELECT * FROM Win32_Process WHERE Name = 'notepad.exe'");
  4. foreach($processes as $process){
  5. echo 'pid: '. $process->ProcessId . "<br>";
  6. }


Dzięki niej istnieje możliwość na pełne kontrolowanie demonów [np. zabijanie wg. pid]


Notka od autora:
----------------------------

Artykuł ten został utworzony do celów "naukowych" i odradza się (szczególnie początkującym programistom) korzystanie z obiektu COM ze względów bezpieczeństwa.




Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 29.03.2024 - 01:01