[PHP] cURL connectie open houden

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • thebrothers
  • Registratie: Mei 2004
  • Laatst online: 27-07 22:00
Hoe kan ik in PHP een cURL connectie open houden?
Tot nu toe heb ik het onderstaande script alleen lijkt het erop dat hij telkens een nieuwe verbinding opent en deze vervolgens sluit. (Closing connection 0#) Iemand ideeën?

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// Request data
$url = "http://url.nl";
$header[] = "Connection: keep-alive";
$header[] = "Keep-Alive: 300";
$curl = curl_init();
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, false);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_FORBID_REUSE, 0);
curl_setopt($curl, CURLOPT_VERBOSE, 1);
curl_setopt($curl, CURLOPT_URL, $url);
while(true){
    $result = curl_exec($curl);
    print($result);
    sleep(30);
}

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 11-09 13:55
Het lijkt me standaard gedrag van curl_exec() om de verbinding te sluiten. Of het uberhaupt kan is dus afhankelijnk of dat een feature van cUrl is.

Zo niet dan is wat jij wilt wel mogelijk door zelf een verbinding op te bouwen met fsockopen().

Acties:
  • 0 Henk 'm!

Verwijderd

De grote vraag is meer : Waarom zou je dat willen ?

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 00:17
frickY schreef op dinsdag 21 juni 2011 @ 13:39:
Het lijkt me standaard gedrag van curl_exec() om de verbinding te sluiten.
Lijkt me wat vreemd, in het voorbeeld in de handleiding gooien ze expliciet een curl_close na een curl_exec. Waarom de verbinding dan wel gesloten wordt is mij echter helaas ook niet bekend. Al geprobeerd de timeout (CURLOPT_TIMEOUT) te verhogen? En wordt de verbinding niet gewoon gesloten aan de ontvangende kant? De meeste webservers knallen je connectie eruit zodra het request afgelopen is afaik :)

[ Voor 13% gewijzigd door FragFrog op 21-06-2011 15:02 ]

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Die curl_close is meer om je resource zelf op te ruimen, niet perse de connectie van curl.

Ik denk dat je t eerder moet zoeken in de server, als die de verbinding sluit dan zal de client dit niet open laten staan denk ik.

Acties:
  • 0 Henk 'm!

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 14-08 12:22

Wiethoofd

Broadcast TOM

Als je meerdere url's tegelijk op wilt vragen zou je naar curl_multi_exec kunnen kijken.

Volg me op Twitter/X & Bluesky


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Weet je ook zeker dat de server dit wel ondersteund? Wanneer je verbinding probeert te maken met tweakers.net, dan zal de webserver "connection: close" terug sturen en ook direct de verbinding verbreken. Doe je hetzelfde op google.nl, dan zal de connectie open blijven omdat je geen dergelijke header terug krijgt.

In combinatie met jouw code krijg ik dan ook:
> * Connection #1 to host www.google.nl left intact

Acties:
  • 0 Henk 'm!

  • thebrothers
  • Registratie: Mei 2004
  • Laatst online: 27-07 22:00
Helaas heb ik geen controle aan de server kant. Het gaat om een applicatie van een derde partij met een daarin ingebouwde webserver die vervolgens weer in contact staat met de informatieverschaffer.
Het gaat constant om dezelfde url die om de 30 sec en 1 sec aangeroepen wordt.
Het leek me namelijk slimmer om constant de verbinding open te laten, vooral bij een interval van 1 sec.
Een andere manier dan cURL mag ook :)

maja als het niet ondersteund wordt houdt het natuurlijk op. ;)

[ Voor 7% gewijzigd door thebrothers op 21-06-2011 23:10 ]


Acties:
  • 0 Henk 'm!

  • TJHeuvel
  • Registratie: Mei 2008
  • Niet online
Wellicht kan je zelf met sockets aan de gang gaan, maar dat is wel een stuk complexer.

Freelance Unity3D developer


Acties:
  • 0 Henk 'm!

  • Feanathiel
  • Registratie: Juni 2007
  • Niet online

Feanathiel

Cup<Coffee>

Technisch: Ik denk niet dat je veel aan sockets gaat hebben. Aan de response te zien, krijg je bij een 'Connection: close' direct een FIN-flag (TCP) mee, wat aangeeft dat de server graag de connectie wilt gaan sluiten. Je zou dit kunnen negeren, maar dan loopt je state niet meer gelijk met die van de server. Dit met als gevolg dat je alsnog de verbinding kwijt bent en het alsnog opnieuw moet proberen. De server heeft dan al de verbinding verbroken en dan kan nooit wat meer terug sturen over dezelfde verbinding. Dan is het gelijkwaardig aan wat thebrothers nu gebruikt.

Kortom, ik denk niet dat je het gaat lukken. Echter, ik ben geen expert op dit gebied, dus verbeter mij waar nodig. :)

[ Voor 17% gewijzigd door Feanathiel op 22-06-2011 01:33 ]


Acties:
  • 0 Henk 'm!

  • thebrothers
  • Registratie: Mei 2004
  • Laatst online: 27-07 22:00
Bedankt voor de reacties :) Ik zal me eens verder gaan verdiepen in sockets hoewel ik bang ben dat Feanathiel gelijk heeft.

Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 11-09 13:55
FragFrog schreef op dinsdag 21 juni 2011 @ 15:00:
[...]

Lijkt me wat vreemd, in het voorbeeld in de handleiding gooien ze expliciet een curl_close na een curl_exec. Waarom de verbinding dan wel gesloten wordt is mij echter helaas ook niet bekend. Al geprobeerd de timeout (CURLOPT_TIMEOUT) te verhogen? En wordt de verbinding niet gewoon gesloten aan de ontvangende kant? De meeste webservers knallen je connectie eruit zodra het request afgelopen is afaik :)
Dat kan goed een ongelukkig gekozen naam zijn, die intern slechts de resource 'closed' en het gebruikte geheugen vrij geeft.


Maar als de externe server geen Keep-Alive's toestaat, kan het niet.

Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Close is (in php) de generieke naam voor het opschonen van resources, zou gek zijn als ze bij deze extensie dat ineens anders noemen.

Het is al eerder gezegt, Keep-Alive moet door de server ondersteund worden.

Kun je niet direct met de informatie verschaffer communiceren, of een plugin schrijven die een socket up houd om updates te sturen? Neem ook aan dat je dit php script dan via de command-line draait (een gebruiker gaat natuurlijk niet 30 sec zitten wachten op een http response)? Het kost misschien iets meer resources, maar 1 connectie per 30 seconden zou geen probleem moeten zijn.
Pagina: 1