cURL via cronjobs zonder timeout.

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

- Ariën -
Beheerder

- Ariën -

05/06/2019 14:34:04
Quote Anchor link
Een simpele vraag, waarvan ik even niet weet hoe ik dit uit moet zoeken, en misschien iemand wel weet hoe dit technisch in elkaar steekt:

Wat gebeurt er met de processen als je een veel gedraaide cronjob draait (elke vijf minuten, direct naar php, geen wget) met een PHP-script die een curl-request doet, die vervolgens blijft wachten op een request. Hoelang blijven deze instances bestaan? En wat als je de webserver of PHP-FPM een reboot geeft? Gaan die instances dan ook allemaal gekilld worden, of moet je dan je hele server even een reboot geven?

Een tip voor een ieder die meeleest: Gebruik een timeout in je curl:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //timeout in seconden, 0 is oneindig
?>
Gewijzigd op 05/06/2019 14:48:56 door - Ariën -
 
PHP hulp

PHP hulp

16/09/2019 23:09:03
 
Thomas van den Heuvel

Thomas van den Heuvel

05/06/2019 16:13:29
Quote Anchor link
Waarom via cURL, en niet een crontab?
En als je niets doet met een response, waarom zou je hier dan op wachten? Volgens mij zijn er opties om enkel het request te doen, zonder op een response te wachten.

Dan is het zaak dat je ook een mechanisme hebt dat detecteert wanneer een cron (niet) is uitgevoerd, anders heb je wellicht niet in de gaten dat er dingen misgaan. Maar dat is een apart probleem, met een aparte oplossing.

Ik neem aan dat je een cURL-request naar een externe bron doet? Zijn er geen andere/betere manieren om dit te doen?

En wat ben je precies aan het doen? Roep je een webservice aan? Of ben je aan het scrapen?
 
- Ariën -
Beheerder

- Ariën -

05/06/2019 16:23:28
Quote Anchor link
Een crontab die via een php-script via php zelf een curl request naar een webservice doet, omdat er via PHP er nog wat scripts moeten plaatsvinden (data in database plaatsen etc)).

Maar wat gebeurt er met die instances dan die eindeloos doordraaien als de webservice niet reageert? Gaan die een keer toch gekilld worden, of blijven die draaien totdat de server gerestart wordt?
 
Ivo P

Ivo P

05/06/2019 17:02:24
Quote Anchor link
PHP heeft in cli mode geen timeout.

een script als
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php  while(true) {} ?>
zal dan ook eindeloos blijven door draaien.

PHP zou dan ook op een curl-request eindeloos kunnen blijven wachten als die niet zelf een (fatal) error opwekt na verloop van tijd.

Dus ja: als dat niet de bedoeling is, zou een timeout op je curl request handig zijn.

Zeker bij de connectie zou je een timeout moeten instellen. Hoe lang je vervolgens wilt wachten op de output van de remote server als je je request gedropt hebt, is een andere timeout.
 
- Ariën -
Beheerder

- Ariën -

05/06/2019 17:07:01
Quote Anchor link
@Ivo P: En die instances dan? Blijven die openstaan? Of gaan die ooit nog eens weg? Of pas als je die handmatig killt of de server zelfs herstart?
 
Ivo P

Ivo P

05/06/2019 17:14:40
Quote Anchor link
Zo lang je script draait, blijft het proces bestaan.

dus als

aap.php =
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php while(true) {} ?>


dan zal
$ php aap.php &

je script starten en dat draait door. (in dit geval zal hij stoppen als de user uitlogt, maar in geval van een cronjob, is dat niet van toepassing).

Je kunt dan met bijvoorbeeld

$ pkill -f aap.php

je script stoppen. Of eerst uitzoeken welke Process ID je moet hebben als er meerdere instanties van dat script draaien. En dan kun je "kill" gebruiken.

Je script stopt, los van onder dwang van "kill"
* als de uitvoering klaar is (einde script)
* er exit() of die() wordt aangeroepen
* er een fatale fout optreedt.

En aangezien er geen timeout van toepassing is, komt een fatale fout niet voort uit een teveel gebruik aan tijd. En ook wbt Memory zou je je bewust moeten zijn van de risico's. Ik vraag me af wat daar de limieten zijn.
 
- Ariën -
Beheerder

- Ariën -

05/06/2019 17:21:47
Quote Anchor link
Ik heb wel begrepen dat de limieten met curl op 5 minuten liggen. Ik zal eens een kijken wat er aan PHP processen draaien.
 
Ivo P

Ivo P

05/06/2019 17:24:58
Quote Anchor link
ps -Af | grep php
 
- Ariën -
Beheerder

- Ariën -

05/06/2019 17:40:43
Quote Anchor link
ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n -r

Dit vond ik wat interressanter, om meteen het geheugenverbuik te zien. Grep op PHP had ook gekund, maar ik toch liever even wat meer zien... ;-)
 
Thomas van den Heuvel

Thomas van den Heuvel

05/06/2019 19:20:52
Quote Anchor link
Weet niet of het verstandig is dat je timeouts zodanig zijn (10 mins?) dat deze de frequentie van het uitvoeren van het script (elke 5 mins?) overstijgen. Kans bestaat dan dat de uitvoering van scripts gaat overlappen.

Als je dan ook nog database-bewerkingen uitvoert die niet in een transactie staan dan wordt dat al snel een grote puinhoop. Waarschijnlijk wil je dat te allen tijde maximaal één zo'n script actief is. In dat geval wil je een soort van semafoor inbouwen die dit garandeert.

Ook zou je natuurlijk kunnen kijken naar efficiëntie, een ruimere periode voor de uitvoering van een "run", en eventueel meer sensoren (of op zijn minst een log) die de uitvoer in de gaten houden.
 
- Ariën -
Beheerder

- Ariën -

05/06/2019 20:09:36
Quote Anchor link
Dat lijkt mij een goed idee. Ik al er eens naar kijken.
Maar nog belangrijker is: Waarom krijg ik een time-out. Blijkbaar blokkeert de webservice mij?
 
Thomas van den Heuvel

Thomas van den Heuvel

05/06/2019 22:37:52
Quote Anchor link
> Waarom krijg ik een time-out. Blijkbaar blokkeert de webservice mij?
Log je een response? Die kan wellicht meer info geven.
Of wellicht strandt het schip eerder, kun je de service wel bereiken?
Gewijzigd op 05/06/2019 22:38:55 door Thomas van den Heuvel
 
- Ariën -
Beheerder

- Ariën -

05/06/2019 22:50:51
Quote Anchor link
Nee, het lijkt erop dat ik die niet kan bereiken, maar thuis op mijn pc wel.
 
- Ariën -
Beheerder

- Ariën -

08/06/2019 16:00:41
Quote Anchor link
Ik heb inmiddels contact opgenomen met de partij, en in de tussentijd tot ik reactie heb, gebruik ik een proxy via een kennis.

En uiteraard nu in de curl-request een timeout meegegeven. Later ga ik even een semafoor inbouwen die dit beter logt.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.