Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Kilka zapytań na jednym sockecie
Piotr_81
post 21.08.2008, 09:13:48
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 1
Dołączył: 25.06.2008

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


Witam.
Miałem pewien skrypt który jeden raz otwierał socket przez fsockopen() a następnie wykonywał zapytania i odbierał odpowiedź - i tak około 10-ciu razy bez zamykania gniazda.

Jednak gdy dzisiaj siadłem do tego skryptu, okazało się że po jednokrotnym pobraniu danych z gniazda, trzeba utworzyć nowe gniazdo i na nim wykonać następne operacje.

Wydaje mi się że coś zmieniło się od roku w php (skrypt ma rok) gdyż wcześniej wszystko działało.
Oto struktura pliku:
  1. <?php
  2. $fp = fsockopen($ip, 80);
  3. while(!$stop)
  4. {
  5. unset($result);
  6. $header = "dane naglowka";
  7. fputs($fp, $header);
  8.  
  9. while ( !feof($fp) )
  10. {
  11. $result .= fgets($fp, 4098);
  12. }
  13. }
  14. ?>


Mnie to wygląda na to że feof zamyka połączenie przy dotarciu do EOF.
Znacie jakieś rozwiązanie tego problemu?
Ciągłe tworzenie nowego gniazda zajmuje zbyt dużo czasu.
Pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 2)
franki01
post 21.08.2008, 10:41:50
Post #2





Grupa: Zarejestrowani
Postów: 508
Pomógł: 75
Dołączył: 2.11.2005
Skąd: Bydgoszcz

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


W PHP 5.2 można wykonywać więcej wywołań na porcie 80, o ile w nagłówku wyślemy:
Kod
Connection: keep-alive
Keep-alive: 300

Jednak do tego potrzebne jest pobranie Content-length ze zwracanych nagłówków i odpowiednia kontrola zwracanej przez serwer treści. Być może używasz Connection: close. Podejrzewam, że głównie właśnie o to chodzi.

A co do kodu:
Pierwsze co przykuwa moją uwagę to kilka drobnych błędów logicznych i to, skąd wzięło się to $stop.

  1. <?php
  2. $fp = fsockopen($ip, 80, $errno, $errstr) or die($errno . ': ' . $errstr); // w wypadku gdy połączenie się nie powiedzie, pętla z feof() nie zapętli się
  3. while(!$stop)
  4. {
  5. $result = ''; // niekonieczna zmiana z unset(), ale jednak wolę używać takiej początkowej deklaracji
  6. $header = "dane naglowka";
  7. fputs($fp, $header);
  8.  
  9. while ( !feof($fp) )
  10. {
  11. $result .= fgets($fp);
  12. }
  13. }
  14. ?>
Go to the top of the page
+Quote Post
Piotr_81
post 21.08.2008, 16:05:35
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 1
Dołączył: 25.06.2008

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


Ja podałem tylko szkielet, program w rzeczywistości wygląda trochę inaczej.
Spróbuję z keep-alive i się odezwę.
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: 13.08.2025 - 22:46