2017-09-21 2 views
0

Ich konfrontiert sehr seltsames Problem auf meinem Hosting. Ich habe Skript und es kann wie dies ich dieses Skript benötigenPHP-Skript wird unendlich ausgeführt, wenn mit Cron aufgerufen

https://mywebsite.com/script.php 

URL ausgelöst werden, um einmal in zwei Tagen durchgeführt werden.

Also habe ich Cron Job erstellt, genau wie mein Hosting-Provider mir geraten hat.

wget -O /dev/null -q 'https://mywebsite.com/script.php' 

Es verwendet wget weil Skript zusätzliche Skripte erfordert - so mein Hosting-Provider sagte, dass ich Aufgabe wie diese erstellen müssen.

Es funktionierte gut für etwa einen Monat, aber für ein paar Wochen habe ich ein Problem. Aus irgendeinem Grund kann ich und mein Hosting-Provider nicht verstehen, wenn ich Skript durch Öffnen von URI im Browser ausführen - Skript einwandfrei ausgeführt (ich weiß es wegen E-Mails, die in 4 verschiedenen Ausführungsschritten gesendet werden). Aber wenn Cron diese Skripte ausführt, wird es unendlich ausgeführt - so bekomme ich weiterhin E-Mails für viele Male, bis ich das Skript umbenenne oder lösche.

Script Ausführungszeit ist ca. 2-3 Minuten. Also, wenn ich es von der URL laufen lasse und bis zum Ende warte - bekomme ich einen Fehler auf dem Bildschirm, dass die Anfragezeit (60 Sek.) Vorbei ist. Aber ich weiß, dass Skripte bis zum letzten Schritt gut funktionieren.

Was ist das Problem?

+0

Setzen Sie 'set_time_limit (60 * 10)' und stellen Sie sicher, dass Ihr Cron nach dem Fehler nicht erneut versucht wird – Justinas

+1

Klingt wie Ihr Skript hat keine Endung und der Browser stoppt nur, weil es maximale Ausführungszeit erreicht. Kannst du deinen Code zeigen? – chris85

+0

* Also, wenn ich es von URL laufen und warten bis es fertig ist - ich bekomme Fehler auf dem Bildschirm, dass die Zeit der Anfrage (60 Sek.) Vorbei ist, es bedeutet, dass es ein Problem im Skript gibt. es stoppt nur wegen Anfrage Timeout. Also müssen Sie Ihren Code zeigen –

Antwort

1

Wget

hatte ich das gleiche Problem an einem gewissen Punkt mit einem PHP-basierten cronjob. Das Problem war, dass wget selbst eine Zeitüberschreitung haben kann. Wenn diese Zeitüberschreitung erreicht ist, wird wget immer wieder versuchen.

Versuchen Sie, einige wget-Optionen zu verwenden, um sicherzustellen, dass es so ausgeführt wird, wie Sie es ausführen möchten. Beispiel:

wget -O /dev/null --tries=1 --timeout=600 'https://mywebsite.com/script.php' 
  • --tries erzählt, wie oft wird es versuchen, auszuführen, wenn ein Timeout angezeigt.
  • --timeout gibt die max exec an. Zeit in Sekunden. Diese Optionen können auch auf Cronjob-Ebene angegeben werden.

PHP Cronjobs

Wenn möglich wird es eine betther Wahl PHP sein kann, führen Sie Ihre Cron-Job direkt zu lassen. Wenn Sie den Server PHP-Verzeichnis wissen könnten Sie einen cronjob wie

/usr/bin/php /srv/www/yousite/html/script.php 

In diesem Fall erstellen Sie keine dritte Partei Programm wie wget müssen zu verlassen. Ob das hilft, hängt davon ab, wie der Cronjob aufgebaut ist. Wenn Ihre Cronjobs beispielsweise $ _SERVER-Variablen verwenden, würde dies nicht funktionieren.

Es gibt einige Einstellungen, die Sie überprüfen möchten, bevor Sie irgendeine PHP-Datei als Cronjob verwenden.

Denken Sie daran, dass die PHP-Konfiguration innerhalb der PHP eingestellt ist.ini könnte auch einen Einfluss auf unerwünschte Fehler auf PHP Cronjobs im Allgemeinen haben. In der php.ini gibt es einen Wert mit dem Namen "max_execution_time" wo die maximale Zeit für die Verarbeitung einer PHP-Anfrage definiert ist.

Eine andere Einstellung, auf die Sie achten sollten, ist die "memory_limit", die ebenfalls in der php.ini-Konfiguration definiert ist. Diese Konfiguration definiert die max. Speicher kann eine PHP-Anfrage verwenden. Da Ihr Cronjob 2-3 Minuten lang läuft, könnte das bedeuten, dass möglicherweise eine Menge Daten im Speicher gespeichert werden, während Sie ihn benutzen.

Beachten Sie, dass jede Anfrage diese Grenzwerte verwendet. Wenn Sie sie auf "high" stellen, kann dies zu Problemen mit der CPU-Last auf Ihrem Server oder zu vielen erzeugten php-Prozessen führen.

Wenn Sie einen Shared Hosting-Dienst oder etwas Ähnliches haben, können Sie diese Einstellungen möglicherweise nicht ändern.

+0

1) sollte ich -q in Parametern verlassen? 2) sollte ich -0 hinzufügen? – moonvader

+0

@moonvader Der Parameter -O gibt nur an, wo das Ergebnis gespeichert wird. Also würde ich definitiv -O/dev/null lassen, da das Ergebnis nicht gespeichert werden soll. Das -q sagt nur wget, es im "ruhigen" Modus zu verwenden. Wget erstellt keine Ausgabe. So teilt -O und -q in Ihren Spezifikationen nur dem Cronjob mit, dass er eine Ausgabe erzeugt oder speichert. Um alle möglichen Optionen für wget vollständig zu verstehen und zu sehen, können Sie [die Dokumentation] (https://www.gnu.org/software /wget/manual/wget.html) – natheriel

+0

Große Antwort! Vielen Dank! – moonvader

Verwandte Themen