Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Serwer http w php
Forum PHP.pl > Forum > PHP
Mlodycompany
Witam. Potrzebuje zrobić prosty serwer http w php. Mam już o to taki kod
  1. #!/usr/local/bin/php ?q
  2. <?php
  3. function a(){
  4. $address = '192.168.0.50';
  5. $port = 8000;
  6. $sock = socket_create(AF_INET, SOCK_STREAM, 0);
  7. socket_bind($sock, $address, $port) or die('Could not bind to address');
  8. socket_listen($sock);
  9.  
  10.  
  11. $client = socket_accept($sock);
  12. while(true){
  13. $input = socket_read($client, 1024);
  14. if($input == ""){
  15. continue;
  16. }
  17. echo "Odebrano:".$input;
  18. $output = "HTTP/1.1 200 OK\r\nDate: Sun, 12 Aug 2012 17:43:12 GMT\r\nServer: Apache/2.2.20 (Ubuntu)\r\nConnection: close\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\nzxc".chr(0);
  19. if(ord($output) !== 0){
  20. @socket_write($client, $output);
  21. echo "Wysłano:".$output;
  22.  
  23. }
  24. unset($input);
  25. unset($output);
  26.  
  27. }
  28. }
  29. a();
  30. ?>

Ten kod działa, ale nie dokońca tak jak powinien. Otóż gdy otwieram w przeglądarce http://192.168.0.50:8000 strona ładuje się, ładuje i załadować nie może. Dopiero gdy zatrzymam ładowanie, wczytywana jest odpowiedź serwera. Serwer odpowiada od razu po otrzymaniu zapytania. To jest pierwszy problem. Drugim problemem jest brak możliwości ponownego połączenia. Musze zresetować serwer aby ponownie wysłać mu zapytanie. Wiecie może dlaczego tak się dzieje?

@edit

Kod jest w fazie prób i błędów także nie jest on za piękny.

Gdy zakomentuje
  1. if($input == ""){
  2. continue;
  3. }

serwer cały czas wysyła odpowiedź
Crozin
1. Powinieneś zamknąć połączenie po jego obsłudze przy pomocy socket_close. Oczywiście powinieneś zamknąć zasób zwrócony przez socket_accept ($client), a nie socket_create ($sock).
2. socket_accept musi znaleźć się wewnątrz pętli, inaczej po obsłużeniu pierwszego żądania, żadne następne nie będzie miało możliwości zostania przyjętym.

PS. Zdajesz sobie sprawę z tego, że w tej chwili masz możliwość obsłużenia wyłącznie jednego połączenia na raz? PHP jest tutaj raczej wybitnie nietrafionym narzędziem ze względu na brak wsparcia dla współbieżności.
Mlodycompany
Tak przekonstruowałem już kod, że jakoś działa (cud).
Cytat
PS. Zdajesz sobie sprawę z tego, że w tej chwili masz możliwość obsłużenia wyłącznie jednego połączenia na raz? PHP jest tutaj raczej wybitnie nietrafionym narzędziem ze względu na brak wsparcia dla współbieżności.
bardzo dobrze zdaję sobie z tego sprawę i na chwilę obecną zupełnie mi to nie przeszkadza smile.gif
irmidjusz
a poza tym, o ile mnie pamięć nie myli, na phpclasses.org jest przynajmniej jedna gotowa implementacja serwera http napisanego w php
zegarek84
być może chce poćwiczyć ;] - ta wiedza w przyszłości może mu się przydać... a przełożyć ją może na inny język programowania i niekoniecznie musi później też pisać serwer HTTP

Guru - Multiplexing
http://devzone.zend.com/209/writing-socket-servers-in-php/
http://blog.wilgucki.pl/2010/04/komunikacj...m-w-czasie.html
dodatkowo, jeśli sockety będziesz miał w trybie nie blokowanym, to sam musisz sprawdzać ile danych wysłałeś (i później musisz ponowić wysyłanie reszty lub wszystkich danych), ile odczytałeś (i analizować też nagłówki zapytań jeśli to ma być większy serwer)...
jeśli chcesz pisać serwer HTTP to zapoznaj się z tym protokołem, podejrzyj też co przeglądarki odbierają (np. w mozilli "live http header" lub firebug), zazwyczaj w nagłówku jest też podana wielkość odpowiedzi za nagłówkami i tymi 2 nowymi liniami (np. nagłówek "Content-Length: 33")

a jeśli miałbyś pisać w C++ zainteresuj się ASIO (jest też BOOST.ASIO - to to samo)...
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.