Toon posts:

[php] idle tijd instellen bij een socket_connect, kan dit?

Pagina: 1
Acties:

Onderwerpen


  • rob3rt
  • Registratie: maart 2009
  • Laatst online: 12-09 01:19
Ik maak gebruik van een simpel php script om naar een bepaalde poort te connecten en aldaar informatie op te vragen van deze server.

Dit werkt allemaal prima echter het wil wel eens voorkomen dat de server waar ik heen connect normaal connect maar eenmaal verbonden geheel geen response terug geeft.
(dit is geen fout van het script maar een fout van de server, dit kan ik zelf niet verhelpen)

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
set_time_limit(5);
$socket = @socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
    if ($socket === false) {
        $restartmessage = "socket_create() failed: reason: " . socket_strerror(socket_last_error()) . "<br>\n";
    $restart_result = FALSE;
    }
    @socket_bind($socket, $ipadres);
    $result = @socket_connect($socket, $ip, $port);
    if ($result === false) {
        $restartmessage = "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "<br>\n";
    $restart_result = FALSE;
    }
    @socket_write($socket, $in, strlen($in));
    while ($out = @socket_read($socket, 2048)) {
        $restartmessage .= $out;
    //echo "out = $out<br>\n";
    }
    if (empty($restart_result)) { 
        $restart_result = TRUE;
    }
    $returnmessage = "$restart_result<>$restartmessage";
    @socket_close($socket);


Dit heeft als gevolg dat mijn script blijft wachten op een reactie en niet afsluit, op zich niet erg ware het niet dat de rest van het script dan ook niet verder loopt.

Nu heb ik gezocht naar een optie om een timeout in te bouwen, dus dat een verbinding na een X aantal idle tijd vanzelf vanuit mijn script wordt verbroken.
Maar hierover kan ik geheel geen informatie vinden of dit wel kan, het lijkt erop dat PHP dit niet ondersteund, klopt dit?

Let wel op dat het niet gaat om een timeout op het maken van de verbinding, dit zit er al in werkt ook normaal. Het gaat er echt om dat als er een verbinding is dat deze dan na een bepaalde idle time automatisch door mijn script wordt verbroken, zodat de rest van het script verder loopt.

Kan iemand me op weg helpen en me een tip geven waar ik gericht op moet zoeken want ik vind zelf via deze forum, google en php.net helaas geen info hierover of dit kan en zo ja hoe dan.

Alvast bedankt voor eventuele reacties.

  • EddoH
  • Registratie: maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Als dit niet standaard in de socket klasse ondersteund wordt kun je dit toch zelf maken?

Voor je while loop een timestamp opslaan, en bij ontvangen van data deze timestamp resetten naar huidige tijd.
Tijdens het 'niet ontvangen' checken hoeveel tijd er is verstreken, en zonodige de verbinding sluiten.
Lijkt me redelijk triviaal.

  • ACM
  • Registratie: januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
Zie de diverse stream_set_*-functies, daar kan je o.a. timeouts instellen (een socket is ook een stream).

Saai uitzicht in je tuin? Hang er een foto voor!


  • LuCarD
  • Registratie: januari 2000
  • Niet online

LuCarD

Certified BUFH

Kan je niet beter fsockopen gebruiken? Die heeft een ondersteuning voor timeouts.

Verder is er een runtime configuration "default_socket_timeout" die zou volgens mij ook moeten werken. Maar ik heb niet echt veel ervaring met socket functies van PHP.

Programmer - an organism that turns coffee into software.


  • EddoH
  • Registratie: maart 2009
  • Niet online

EddoH

Backpfeifengesicht

LuCarD schreef op maandag 11 oktober 2010 @ 11:35:
Kan je niet beter fsockopen gebruiken? Die heeft een ondersteuning voor timeouts.

Verder is er een runtime configuration "default_socket_timeout" die zou volgens mij ook moeten werken. Maar ik heb niet echt veel ervaring met socket functies van PHP.
Hij geeft duidelijk aan dat de timeout bij het connecten al werkt, en dat hij een timeout voor het ontvangen van data nodig heeft...

  • rob3rt
  • Registratie: maart 2009
  • Laatst online: 12-09 01:19
Bedankt EddoH,

Jij begrijpt hem, de andere tips hebben betrekking tot het maken van de verbinding.
Het gaat me er inderdaad juist om dat als er een idle optreedt tijdens de verbinding dat de connectie dan wordt onderbroken.

Maar een while loop lijkt me ook niet dat dit kan, als ik deze start en er gebeurd dan niets meer aan de kant waar ik heen connect loopt deze loop dan toch ook niet of zie ik dat nu verkeerd?

[Voor 5% gewijzigd door rob3rt op 11-10-2010 11:55]


  • EddoH
  • Registratie: maart 2009
  • Niet online

EddoH

Backpfeifengesicht

Volgens mij gaf ACM ook een valide optie:
http://php.net/manual/en/function.stream-set-timeout.php
Maar ik heb geen ervaring met PHP, dus dit kan ik niet verifieren.

Mijn oplossing in psuedo code (ff snel):

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
socket = connect_socket();
lastReceived = currentTime(); 
while(!done)
{
  bytesReceived = socket.receive(buffertje);
  if(bytesReceived == 0)
  {
     if(currentTime() - lastReceived > TIMEOUT)
       done = true;
  }
  else
  {
    handle_data(buffertje); 
    lastReceived = currentTime(); 
  }
}

[Voor 4% gewijzigd door EddoH op 11-10-2010 12:13]


  • LuCarD
  • Registratie: januari 2000
  • Niet online

LuCarD

Certified BUFH

Misschien is dit wel interessant voor je.

http://www.slideshare.net/wezfurlong/php-streams-lucky-dip

Programmer - an organism that turns coffee into software.


  • ACM
  • Registratie: januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

(jarig!)
rob3rt schreef op maandag 11 oktober 2010 @ 11:54:
Bedankt EddoH,

Jij begrijpt hem, de andere tips hebben betrekking tot het maken van de verbinding.
Het gaat me er inderdaad juist om dat als er een idle optreedt tijdens de verbinding dat de connectie dan wordt onderbroken.
De stream_set_timeout is daar voor bedoeld. En ik gebruik 'm er zelf in diverse toepassingen ook om te voorkomen dat het na een connectie alsnog te lang duurt om te wachten op een webservice.

Saai uitzicht in je tuin? Hang er een foto voor!


  • rob3rt
  • Registratie: maart 2009
  • Laatst online: 12-09 01:19
Ja ok, maar deze functie werkt dus niet met
socket_create(AF_INET, SOCK_STREAM, SOL_TCP); , socket_connect($socket, $ip, $port);, socket_write($socket, $in, strlen($in)); en socket_read

Als ik dus deze stream instel dan krijg ik dit deze error:
stream_set_timeout(): supplied resource is not a valid stream resource in blabla

  • Matis
  • Registratie: januari 2007
  • Laatst online: 15:11

Matis

Rubber Rocket

rob3rt schreef op maandag 11 oktober 2010 @ 12:57:
Ja ok, maar deze functie werkt dus niet met
socket_create(AF_INET, SOCK_STREAM, SOL_TCP); , socket_connect($socket, $ip, $port);, socket_write($socket, $in, strlen($in)); en socket_read

Als ik dus deze stream instel dan krijg ik dit deze error:
stream_set_timeout(): supplied resource is not a valid stream resource in blabla
Dat is nogal wiedes, ACM heeft het zelfs al verklapt in zijn eerste post :)

Edit; ik bedoel LuCarD :$

[Voor 3% gewijzigd door Matis op 11-10-2010 13:13]

If money talks then I'm a mime
If time is money then I'm out of time


  • LuCarD
  • Registratie: januari 2000
  • Niet online

LuCarD

Certified BUFH

En als je dit probeert ipv stream_set_timeout

code:
1
socket_set_option( $socket  , SOL_SOCKET, SO_RCVTIMEO, array('sec' => 1, 'usec' => 0) );

http://nl2.php.net/manual/en/function.socket-get-option.php

Programmer - an organism that turns coffee into software.


  • rob3rt
  • Registratie: maart 2009
  • Laatst online: 12-09 01:19
$matis
Ik wil geen fsocket gebruiken, het hele script is nu gemaakt via de socket_create optie, tevens dien ik de socket via een bepaald IP adres uitgaand te openen, ik gebruik dus ook een socket bind nog, zover mij bekend kan dit laatste ook niet via fsock open.

@lucard:
Ik ga je opties eens proberen

Update:
De optie: socket_set_option( $socket , SOL_SOCKET, SO_RCVTIMEO, array('sec' => 3, 'usec' => 0) ); lijkt inderdaad te werken, probleem zoals ik het nu kan zien is verholpen.

Thx voor de hulp en natuurlijk de reacties.

[Voor 27% gewijzigd door rob3rt op 11-10-2010 17:50]

Pagina: 1


Nintendo Switch (OLED model) Apple iPhone 13 LG G1 Google Pixel 6 Call of Duty: Vanguard Samsung Galaxy S21 5G Apple iPad Pro (2021) 11" Wi-Fi, 8GB ram Nintendo Switch Lite

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2021 Hosting door True

Tweakers maakt gebruik van cookies

Bij het bezoeken van het forum plaatst Tweakers alleen functionele en analytische cookies voor optimalisatie en analyse om de website-ervaring te verbeteren. Op het forum worden geen trackingcookies geplaatst. Voor het bekijken van video's en grafieken van derden vragen we je toestemming, we gebruiken daarvoor externe tooling die mogelijk cookies kunnen plaatsen.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Forum cookie-instellingen

Bekijk de onderstaande instellingen en maak je keuze. Meer informatie vind je in ons cookiebeleid.

Functionele en analytische cookies

Deze cookies helpen de website zijn functies uit te voeren en zijn verplicht. Meer details

janee

    Cookies van derden

    Deze cookies kunnen geplaatst worden door derde partijen via ingesloten content en om de gebruikerservaring van de website te verbeteren. Meer details

    janee