Hallo,

Ik heb een PHP-script gemaakt dat wordt uitgevoerd dmv een cronjob, maar hij stopt soms voortijdig op onverklaarbare wijze. Ik gebruik een for-loop om data te scrapen (niks illegaals) van pagina's die vrijwel identiek zijn. Als het script is afgerond krijg ik dan een mail met hoeveel pagina's hij heeft nagelopen. 9 van de 10 keer gaat het perfect, maar soms komt het dus voor dat hij het eind van het script niet haalt, en maar een beperkt deel van het aantal loops uitvoert. Als ik dan kijk bij welk nummer hij is gestopt dan is daar geen aanwijsbare reden voor te vinden.

Ik had al wat nagezocht en het volgende in de code gestopt om een timeout te voorkomen.

<?php
set_time_limit(0);
ignore_user_abort(true);
?>


Ik zal de hele code besparen, het is ook niet veel bijzonders, maar de loop ziet er als volgt uit. In elke loop maak ik opnieuw connectie met de database zodat die geen timeout geeft.

- Connectie maken met MySQL database
- Data escapen
- Data invoeren
- Updaten in database welke hij laatst heeft gehad
- Connectie verbreken

Ik heb de opdracht opgeknipt in brokjes, maar wat zou de reden kunnen zijn dat hij tussentijds stopt? En is er een mogelijkheid om dat in die mail terug te kunnen zien? Kan het nog steeds door connectie-verlies komen? Een error bij de betreffende insert lijkt me onmogelijk, en dan moet hij volgens mij ook gewoon verdergaan. De laatste keer stopte hij al na 30 loops, terwijl hij er normaal 5000 doet. Hij doet ongeveer vijf loops per seconde.

Ik heb de cronjob ingesteld vanuit DirectAdmin, dus die hele technische taal mbt de cronjob/logs etc en waar ik dat zou moeten invullen is me niet helemaal eigen.


Ik hoop dat jullie me kunnen helpen.
Hoe voer je de cornbjob uit? Met welk commando?
Voer je het script dus direct aan PHP, of laat je het via bijv. wget eerst nog via de webserver lopen?
- Ariën - op 20/03/2017 15:49:39

Hoe voer je de cornbjob uit? Met welk commando?
Voer je het script dus direct aan PHP, of laat je het via bijv. wget eerst nog via de webserver lopen?


Gewoon in DirectAdmin ingevoerd met die sterretjes. En bij command staat:
/usr/local/bin/php -q -f/home/username/domains/domeinnaam.nl/public_html/phpdocument.php
Direct aan PHP dus. Heb je al de output naar een log geschreven?
En vooral: staat error reporting (en display_errors) aan (borkt hij niet gewoon op geheugen)?
Wat Ben zegt, en dan de boel goed loggen! Desnoods ook even het geheugen timen, en kijken of hij daar ergens op spaak loopt.
Nu wordt het wel vrij technisch. Ik ben een beginner, dus nog niet helemaal thuis op dit gebied.

@Ariën: Nee. Ik las dat het verstandig was om een log te hebben van wat de cronjob doet. Maar die 'html' van de pagina stuurt hij naar de mail, dat is de log?

@Ben: Volgens mij wel, maar dat kan ik voor de zekerheid aanzetten met onderstaande?

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1);
?>

En wat betekent 'borkt hij niet gewoon op het geheugen'?

@Ariën2: Zou je misschien kunnen uitleggen hoe dat moet?
Je kunt het gewoon met de standaard reporting regels aanzetten ja. Vaak is de cli php configuratie anders dan de web configuratie, dus het is altijd mogelijk dat cronjobs afwijken van websites.

>> En wat betekent 'borkt hij niet gewoon op het geheugen'?
Schiet je niet gewoon door de geheugenlimiet?
De log is de complete output van je script. Die wordt nu dus ook gemaild, dat volstaat dat ook. In ieder geval bedoel ik wel de hele output welke je anders in je browser ook zou zien. Staan daar foutmeldingen in (zet wel je error_reporting hoog en display_errors aan)

Tevens raad ik niet aan om cronjobs in de public_html te plaatsen. Je wilt toch niet dat jan en alleman ze kunnen uitvoeren?
Ben van Velzen op 20/03/2017 16:47:03

Je kunt het gewoon met de standaard reporting regels aanzetten ja. Vaak is de cli php configuratie anders dan de web configuratie, dus het is altijd mogelijk dat cronjobs afwijken van websites.

>> En wat betekent 'borkt hij niet gewoon op het geheugen'?
Schiet je niet gewoon door de geheugenlimiet?


Ik heb er niet veel verstand van, maar dat denk ik niet. Volgens mij is er niet veel geheugen benodigd voor wat ik doe. Zou zoiets ook als error worden gemeld? En hoe valt dat te meten/timen?


@Ariën: Daar zit wat in, maar als beginner zet ik alles in public_html. In welke map zou ik dat moeten zetten dan, of kan je een cronjob in elke map zetten? Ik had dat probleem met onderstaande PHP gedicht.

<?

$sapi_type = php_sapi_name();
	if(substr($sapi_type, 0, 3) == 'cli' || empty($_SERVER['REMOTE_ADDR'])) {

//En de rest van de code hier

}
?>
>> Ik heb er niet veel verstand van, maar dat denk ik niet. Volgens mij is er niet veel geheugen benodigd voor wat ik doe. Zou zoiets ook als error worden gemeld? En hoe valt dat te meten/timen?

Als je reporting aan hebt staan wel, anders stopt je script op een ogenschijnlijk willekeurig moment. Je kunt het meten door regelmatig [php]memory_get_peak_usage[/php] aan te roepen, en dit te vergelijken met je memory_limit.

Reageren