Toon posts:

[PHP] cURL connectie open houden

Pagina: 1
Acties:

Onderwerpen


  • thebrothers
  • Registratie: Mei 2004
  • Laatst online: 31-10-2019
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);
}

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 20:14
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().

  • thioz
  • Registratie: September 2001
  • Laatst online: 06-11-2018
De grote vraag is meer : Waarom zou je dat willen ?

I feel like i've been taking crazy pills


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 13:59
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 ]


  • 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.

  • Wiethoofd
  • Registratie: Juli 2007
  • Laatst online: 22-05 18:43
Als je meerdere url's tegelijk op wilt vragen zou je naar curl_multi_exec kunnen kijken.

Wiethoofds meuk en 'overige'


  • 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

  • thebrothers
  • Registratie: Mei 2004
  • Laatst online: 31-10-2019
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]


  • 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


  • 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]


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

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 20:14
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.

  • 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


Tweakers maakt gebruik van cookies

Tweakers plaatst functionele en analytische cookies voor het functioneren van de website en het verbeteren van de website-ervaring. Deze cookies zijn noodzakelijk. Om op Tweakers relevantere advertenties te tonen en om ingesloten content van derden te tonen (bijvoorbeeld video's), vragen we je toestemming. Via ingesloten content kunnen derde partijen diensten leveren en verbeteren, bezoekersstatistieken bijhouden, gepersonaliseerde content tonen, gerichte advertenties tonen en gebruikersprofielen opbouwen. Hiervoor worden apparaatgegevens, IP-adres, geolocatie en surfgedrag vastgelegd.

Meer informatie vind je in ons cookiebeleid.

Sluiten

Toestemming beheren

Hieronder kun je per doeleinde of partij toestemming geven of intrekken. Meer informatie vind je in ons cookiebeleid.

Functioneel en analytisch

Deze cookies zijn noodzakelijk voor het functioneren van de website en het verbeteren van de website-ervaring. Klik op het informatie-icoon voor meer informatie. Meer details

janee

    Relevantere advertenties

    Dit beperkt het aantal keer dat dezelfde advertentie getoond wordt (frequency capping) en maakt het mogelijk om binnen Tweakers contextuele advertenties te tonen op basis van pagina's die je hebt bezocht. Meer details

    Tweakers genereert een willekeurige unieke code als identifier. Deze data wordt niet gedeeld met adverteerders of andere derde partijen en je kunt niet buiten Tweakers gevolgd worden. Indien je bent ingelogd, wordt deze identifier gekoppeld aan je account. Indien je niet bent ingelogd, wordt deze identifier gekoppeld aan je sessie die maximaal 4 maanden actief blijft. Je kunt deze toestemming te allen tijde intrekken.

    Ingesloten content van derden

    Deze cookies kunnen door derde partijen geplaatst worden via ingesloten content. Klik op het informatie-icoon voor meer informatie over de verwerkingsdoeleinden. Meer details

    janee