Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

Für allgemeine Software
WernerWetter
Offline
Beiträge: 79
Registriert: 07 Dez 2020, 18:19
Wohnort: Ulm / Grimmelfingen
Hat sich bedankt: 10 mal
Danksagung erhalten: 18 mal

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#11

Beitrag von WernerWetter »

Code: Alles auswählen

while($i < 3 && $switch )
das passt schon. Oder wenn es mit "true" sein sollte gerne auch:

Code: Alles auswählen

while(($i < 3 && $switch) == true )
aber deine "Verbesserungen" sind falsch.

Was ich nicht so schön finde ist das sofortige wiederholen. Eine kurze Pause bei "Internetzugriffen" würde meiner Meinung nach zwischen den wiederholten Versuchen nicht schaden

Code: Alles auswählen


$i = 0;	

// solange nicht erfolgreich  wird die folgende Schleife 3mal ausgeführt  
while($i < 3  ){
	// Funktion aufrufen - Ergebnis in Variable speichern
	$pushResp = pushToWU($urlWUb);
	// wenn Ergebnis "success" --> abbrechen stellen
	if($pushResp == "success"){
		break;
	}
	// Zählvariable erhöhen
	$i++;
	sleep($i *2); // bei jedem "retry" ein wenig länger warten (2,4,6 Sek) ,,,,
}	

// Fehlerbehandlung!!
if ($pushResp != "seccess") {

	// Fehler!

} 

Benutzeravatar
Wetterfrosch
Offline
Beiträge: 403
Registriert: 08 Dez 2020, 11:49
Wohnort: 79410 Badenweiler (350mNN) / Breisgau-Hochschwarzwald
Hat sich bedankt: 104 mal
Danksagung erhalten: 32 mal
Kontaktdaten:

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#12

Beitrag von Wetterfrosch »

Hi,

ja das mit dem sleep() hatte ich zuvor in der Schleife drin, da ich genau den selben Gedankengang wie du hatte, doch ich glaube ich hatte das sleep() falsch eingebaut gehabt.
Hab das script jetzt mal so wie von dir vorgeschlagen eingebunden, vielen Dank für die Hilfe, hätte aber noch eine Frage:

Wenn das pushtowu in meinem Script nicht klappt, wird die Schleife nach 3 Durchläufen abgebrochen, richtig?
Was jetzt etwas komisch im Cronjob ist, manchmal scheint irgendwas zu "klemmen", denn da versucht der Cronjob das Script 30 Sekunden lang auszuführen, ohne Erfolg und bricht dann ab.
Doch wenn die Schleife nicht erfolgreich ist, dann sollte ja nur die Uploadfunktion zu WU abgebrochen werden, das restliche Script, was nix mit dem Upload zu WU zu tun hat, sollte doch davon dann unbeeinflusst bleiben, doch wieso ist der Cronjob dann 30 Sekunden lang ohne Erfolg und bricht dann wegen "Time out" ab?

Ich kann mir im Script eben nur die Uploadfunktion zu WU vorstellen, dass es da hängt oder eventuell noch wenn ich die API auslese, worüber ich die Werte abfrage, dass es eventuell hier noch zu Verzögerungen kommt, die das Script verlangsamen und somit der Cronjob im Schnitt ca. 2x Pro Stunde nach 30 Sekunden abbricht?



Gruß Frank
WernerWetter
Offline
Beiträge: 79
Registriert: 07 Dez 2020, 18:19
Wohnort: Ulm / Grimmelfingen
Hat sich bedankt: 10 mal
Danksagung erhalten: 18 mal

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#13

Beitrag von WernerWetter »

Wenn das pushtowu in meinem Script nicht klappt, wird die Schleife nach 3 Durchläufen abgebrochen, richtig?
Hmm, eigentlich nicht abgebrochen. Die Schleife wird (wie vorher) nach dem 3ten Mal beendet. "(i < 3)"
Ich kenne das ganze Skript nicht. Ggf. sollte/könnte danach noch eine Fehlerbehandlung geschehen.

Die Funktion

Code: Alles auswählen

pushToWU($urlWUb);
kenne ich nicht. "push to Weather Underground".
Ein Problem könnte sein, wenn WU nicht Antwortet, dann wartet das Script irgendwo innerhalb der Funktion "pushToWU".

Kannst Du die Funktion "pushToWU" mal hier einstellen?

Alle Funktionen die mit URL/Stream (zB. file_get_contents) arbeiten, haben timeouts. Ggf. könnte man diese timeouts verringern und damit ein "retry" anstoßen bevor das Skript beendet wird.....
WOBEI:
Ich könnte mir auch vorstellen, dass dein CJ nicht vom Hoster abgebrochen wird, sondern dass PHP einen timeout meldet (über den Fehleroutput stderr) und dein Hoster diesen Fehler pflichtschuldig in den CJ Log schreibt.

Wichtig! Wenn etwas schief geht. Eine Fehlerbehandlung einbauen! Zum Beispiel error_log

Code: Alles auswählen

error_log("So ein Mist, 3 mal versucht und immer noch keine Verbindung", 0);
Oder hier für dein "anderes" Problem:

Code: Alles auswählen

// Das @ unterdrückt Fehlermeldungen
$arr = @file_get_contents('http://api.holfuy.com/live/?s=1497&pw=xyz=CSV&tu=C&su=km/h');

if (($arr === false) OR (empty($arr) ){
	die("Keine Daten bekommen, ich will nicht mehr...");
}
$arr = explode(",",$arr);
Aber das ist alles sehr viel Konjunktiv, Ich kenne dein Skript nur teilweise....

edit: Code korrigiert ...
Benutzeravatar
Wetterfrosch
Offline
Beiträge: 403
Registriert: 08 Dez 2020, 11:49
Wohnort: 79410 Badenweiler (350mNN) / Breisgau-Hochschwarzwald
Hat sich bedankt: 104 mal
Danksagung erhalten: 32 mal
Kontaktdaten:

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#14

Beitrag von Wetterfrosch »

hi,

also der code für die push-funktion ist dieser:

Code: Alles auswählen

// Funktion zum Aufruf der Wunderground URL
    function pushToWU($url){
	// cURL initialisieren
	$ch = curl_init($url);
	// cURL Optionen setzen
	curl_setopt($ch, CURLOPT_HEADER, 0);
	// cURL ausführen (Daten an den Browser weiterreichen) - Ergebnis in Variable speichern
	$returncode = curl_exec($ch);
	// cURL schliessen
    curl_close($ch);	
	return $returncode;	
	}
und danach kommt dann deine Schleife mit der dann ich die daten zu WU sende.

Diese push-Funktion hat mir hier im Forum ein Mitglied mal geschrieben, da es ohne diese push-Funktion irgendwie permanent Sendeprobleme zu WU gab.

Gibt es denn eine Möglichkeit, wie ich herausfinden kann, was den Cronjob immer wieder zum Abbruch bewegt?
Ich habe ihn ja jetzt mal ausgelagert auf cron-job.org, dort bricht er wesentlich weniger ab als zuvor bei meinem Hoster, trotzdem würde mich interessieren, wieso er ca. 2x pro Stunde plötzlich 30 Sekunden benötigt um das Script auszuführen und dann eben mit "Time out" abbricht, wenn er läuft, dauert das Ausführen meist nur um die 300ms.
Als ich den CJ noch auf dem Webhoster laufen hatte, brach der CJ noch öfters ab, da stand dann immer in der error-log-Datei "too many requests - try again later success".
Gerade festgestellt, wenn ich die PHP-Datei manuell von meinem Browser aufrufe, welche sonst vom CJ angestoßen wird, bekomme ich ebenso diese "too many request-meldung", dennoch wird das PHP Script ausgeführt, vielleicht hilft das bei der Fehlereingrenzung weiter?
WernerWetter
Offline
Beiträge: 79
Registriert: 07 Dez 2020, 18:19
Wohnort: Ulm / Grimmelfingen
Hat sich bedankt: 10 mal
Danksagung erhalten: 18 mal

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#15

Beitrag von WernerWetter »

Laut Beschreibung von curl_exec:
Returns true on success or false on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, false on failure.

Code: Alles auswählen

// Funktion zum Aufruf der Wunderground URL
    function pushToWU($url){
	// cURL initialisieren
	$ch = curl_init($url);
	// cURL Optionen setzen
	curl_setopt($ch, CURLOPT_HEADER, 0);
	// cURL ausführen (Daten an den Browser weiterreichen) - Ergebnis in Variable speichern
	$returncode = curl_exec($ch);
	// cURL schliessen
    curl_close($ch);	
	return $returncode;	
	}
Eigentlich sollte laut Beschreibung oben nie "success" in der Variablen "$returncode" stehen.

Code: Alles auswählen

// Funktion zum Aufruf der Wunderground URL
    function pushToWU($url){
	// cURL initialisieren
	$ch = curl_init($url);
	// cURL Optionen setzen
	curl_setopt($ch, CURLOPT_HEADER, 0);
	// cURL ausführen (Daten an den Browser weiterreichen) - Ergebnis in Variable speichern
	$returncode = curl_exec($ch);
	// cURL schliessen
      curl_close($ch);

      // returncode  setzen
      if ($returncode === false){
      	error_log("curl_exec war nicht erfolgreich", 0);
      }
      else {
      	$returncode = "success";
      }
      
	return $returncode;	
	}
Da Du das Script ja also Kommandozeile ausführen kannst, würde ich Dir sehr empfehlen mit "echo" oder "print_r" die ein oder andere Stelle im Programm zu versehen.

Beispiel:

Code: Alles auswählen

// Funktion zum Aufruf der Wunderground URL
    function pushToWU($url){
    
    	echo "enter pushToWU\n";
    	 
	// cURL initialisieren
	$ch = curl_init($url);
	// cURL Optionen setzen
	curl_setopt($ch, CURLOPT_HEADER, 0);
	// cURL ausführen (Daten an den Browser weiterreichen) - Ergebnis in Variable speichern
	
	$returncode = curl_exec($ch);
	print_r($returncode);
	
	// cURL schliessen
      curl_close($ch);

      // returncode  setzen
      if ($returncode === false){
      	error_log("curl_exec war nicht erfolgreich", 0);
      }
      else {
	echo "curl_exec erfolgreich: <<$returncode>> \n ;
      	$returncode = "success";
      }
      
	return $returncode;	
	}
Benutzeravatar
Wetterfrosch
Offline
Beiträge: 403
Registriert: 08 Dez 2020, 11:49
Wohnort: 79410 Badenweiler (350mNN) / Breisgau-Hochschwarzwald
Hat sich bedankt: 104 mal
Danksagung erhalten: 32 mal
Kontaktdaten:

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#16

Beitrag von Wetterfrosch »

das "success" kommt von WU, d.h. wenn ich über die URL meine Daten zu WU sende, erhalte ich bei erfolgreicher Übertragung als Antwort auf dieses senden ein "success"

Hab den Teil im Script gefunden der Probleme macht, es ist nicht das Senden zu WU sondern das Senden zu Awekas:

Code: Alles auswählen

   $IDawb = 'xxx';
   $PASSWORDawb = 'yyy';


$urlAWb = "http://ws.awekas.at/weatherstation/updateweatherstation.php?ID=$IDawb&PASSWORD=$PASSWORDawb&action=$action&dateutc=$dateutc&tempf=$tempfb&dewptf=$dewptfb&humidity=$humidityb&winddir=$winddirb&windspeedmph=$windspeedmphb&windgustmph=$boeb&baromin=$barominb";


// Zählvariable anlegen
$iab = 0;	


 
while($iab < 3){
	// Funktion aufrufen - Ergebnis in Variable speichern
	$pushRespab = pushToWU($urlAWb);
	// wenn Ergebnis "OK" --> schleife beenden
	if($pushRespab == "OK"){
		break;
	}
	// Zählvariable erhöhen
	$iab++;
	sleep($iab *2); // bei jedem "retry" ein wenig länger warten (2,4,6 Sek)
	

	
}
Ich habe dann auch mal die Schleife ausgebaut und nur pro Aufruf des Scriptes 1x an awekas gesendet, um auszuschließen, dass da an der Schleife ein Fehler vorliegt, doch auch dann bekomme ich alle paar Minuten in der CJ-Log-Datei die Meldung "too many requests - try again later", liegt also augenscheinlich am Awekas Server, doch wieso macht er Probleme beim minütlichen Sendeintervall?
Meine Hauptwetterstation, die über die Station selbst direkt an Awekas angeschlossen ist, sendet sogar im 16 Sekundentakt und da gibt es keine Probleme.

Nachtrag:

Wenn ich zu Awekas nicht über die pushTo Funktion sende, also nicht das gleiche Script wie zum senden zu WU verwende, sondern zu Awekas einfach über folgenden Code sende:

Code: Alles auswählen

    $urlAWb = fopen("http://ws.awekas.at/weatherstation/updateweatherstation.php?ID=$IDawb&PASSWORD=$PASSWORDawb&action=$action&dateutc=$dateutc&tempf=$tempfb&dewptf=$dewptfb&humidity=$humidityb&winddir=$winddirb&windspeedmph=$windspeedmphb&windgustmph=$boeb&baromin=$barominb", "r");
    fclose($urlAWb);
    
besteht Problem nicht mehr.
Komisch, kann sich das Jemand erklären?
Kann ich mit dieser PushToWU Funktion nicht an 2 URL seden?
Funktioniert zwar nun auch mit "fopen()", doch die pustoWU Funktion wurde damals eingebaut, weil wenn ich zu WU über "fopen()" sende, es immer wieder zu Übertragungsaussetzern kam, d.h. es konnte passieren, dass z.b. über mehrere Minuten bei WU nix angekommen ist, mit der PushToWU-Funktion hatte das dann zuverlässiger geklappt und deswegen dachte ich, ich stell beim Senden an Awekas eben auch von "fopen()" auf PushToWU um
WernerWetter
Offline
Beiträge: 79
Registriert: 07 Dez 2020, 18:19
Wohnort: Ulm / Grimmelfingen
Hat sich bedankt: 10 mal
Danksagung erhalten: 18 mal

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#17

Beitrag von WernerWetter »

sorry ich schreib zu viel.

Meiner Meinung nach hat die Funktion pushToWU einen Fehler (ggf. durch eine neue PHP Version gekommen):
curl_exec:
Returns true on success or false on failure. However, if the CURLOPT_RETURNTRANSFER option is set, it will return the result on success, false on failure.
Da kommt wohl kein "success" zurück von curl_exec nur true oder false. Dies bedeutet, dass diese Funktion immer 3 mal ausgeführt wird. Deshalb meine Ergänzung:

Code: Alles auswählen

...
     // returncode  setzen
      if ($returncode === false){
      	error_log("curl_exec war nicht erfolgreich", 0);
      }
      else {
	echo "curl_exec erfolgreich: <<$returncode>> \n ;
      	$returncode = "success";
      }
      
...
Benutzeravatar
Wetterfrosch
Offline
Beiträge: 403
Registriert: 08 Dez 2020, 11:49
Wohnort: 79410 Badenweiler (350mNN) / Breisgau-Hochschwarzwald
Hat sich bedankt: 104 mal
Danksagung erhalten: 32 mal
Kontaktdaten:

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#18

Beitrag von Wetterfrosch »

bei meiner WU-Schleife kommt eine "Success" zurück, bei der Schleife für Awekas ist die Antwort "OK", deswegen in der dortigen Schleife anstatt "Success" dann das "OK" als Parameter für die Beendigung der Schleife.
Awekas sendet auch das "OK", kann ich in den CJ-Logfiles sehen, wenn Übertragung geklappt hat.
WernerWetter
Offline
Beiträge: 79
Registriert: 07 Dez 2020, 18:19
Wohnort: Ulm / Grimmelfingen
Hat sich bedankt: 10 mal
Danksagung erhalten: 18 mal

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#19

Beitrag von WernerWetter »

Oh!

Dann verhält sich der Befehl bei deinem Hoster anders als in php.net (https://www.php.net/manual/de/function.curl-exec.php) beschrieben oder ggf. ist CURLOPT_RETURNTRANSFER auf "true" gesetzt - oder ist der default Wert "true"?!

Hast Du mal Loggings eingebaut wie oft zB curl_exec für AWECAS aufgerufen wird? Einmal oder dreimal?
Benutzeravatar
Wetterfrosch
Offline
Beiträge: 403
Registriert: 08 Dez 2020, 11:49
Wohnort: 79410 Badenweiler (350mNN) / Breisgau-Hochschwarzwald
Hat sich bedankt: 104 mal
Danksagung erhalten: 32 mal
Kontaktdaten:

Re: Cronjob bricht nach einiger Zeit ab - liegt wohl an einem Fehler im PHP-Script - brauche Hilfe

#20

Beitrag von Wetterfrosch »

Ich sende an awekas ja jetzt mit fopen, das funktioniert, nur bei wu machte fopen Probleme.
Ich kann aber das script ja mal so umschreiben wie du vorgeschlagen hast, mal sehen was dann passiert oder ich lasse bei awekas mal die Schleife weg und sende nur 1x über pushto wenn es dann geht, hast du recht, dann wird die Schleife wohl mehrfach durchlaufen, wie ich das aber testen und ausgeben kann, weiß ich nicht, dazu bin ich zu sehr php leihe.
Kann das alles aber erst morgen testen, da ich aktuell auf der nachtschicht sitze und keinen Zugriff auf meinen Rechner habe.
Antworten