15 Stimmen

Skripte ohne CRON einplanen

Ich weiß, dass es viele Beiträge über die Verwendung von CRON zur Ausführung einer php-Datei gibt. Aber in der Welt des Shared Hosting und der einfachen Einrichtung für einen Benutzer möchte ich mich nicht damit herumschlagen müssen.

Ich habe online eine andere Lösung gefunden, die mit Steckdosen zu tun hat. Wollte nur jeder nehmen auf diese, und sagen Sie mir, wenn dies eine gute oder schlechte Idee ist. Klingt wie es gut funktioniert.

Was denken Sie?

//Open socket connection to cron.php
$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10);
if($socketcon) {
$socketdata = "GET /cron.php HTTP 1.1\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n";
fwrite($socketcon,$socketdata);
//Normally you would get all the data back with fgets and wait until $socketcon reaches feof.
//In this case, we just do this:
fclose($socketcon);
} else {
//something went wrong. Put your error handler here.
}

cron.php:

//This script does all the work.
sleep(200);
//To prove that this works we will create an empty file here, after the sleep is done.
//Make sure that the webserver can write in the directory you're testing this file in.
$handle = fopen('test.txt','w');
fclose($handle);

Ich habe das Skript in einem Blogbeitrag gefunden: http://syn.ac/tech/13/creating-php-cronjobs-without-cron-and-php-cli/

5voto

ghostdog74 Punkte 305138

Ein Cron-Job ist im Grunde ein Cron-Job. Sie richten ihn ein, und das Betriebssystem führt den Job für Sie aus. Ich bin mir nicht sicher, wie das PHP-Skript funktioniert, das Sie von der Website erhalten haben, aber wenn es menschliches Eingreifen erfordert, dann ist es nicht wirklich ein Cron-Job. Wenn Sie Cron nicht verwenden möchten, können Sie eine Schleife verwenden und dann die Datumsfunktionen von PHP nutzen, um ein Datum und eine Uhrzeit festzulegen. Pseudocode

while (1) {
    $d=date("d");
    if ( $d == "01" ){
        //run every 1st of month
        //code to run here
    }
}

4voto

Xorlev Punkte 8393

Das ist keine schlechte Methode, aber Sie müssen sicherstellen, dass durch das Schließen des Sockets das Skript nicht einfach beendet wird, bevor es fertig ist. Sie können Sockets auf nicht-blockierend einstellen.

Ich würde trotzdem einen Cron-Job verwenden, auch wenn es ein bisschen mühsam ist.

2voto

Gregory Magarshak Punkte 1845

Dies hat eine andere Wirkung als cron.

Ein Cron-Job läuft zu bestimmten Zeiten, die Sie im Voraus festgelegt haben.

Ihre Methode ist im Grunde eine Art "Gabelung" oder "asynchroner Aufruf" eines PHP-Skripts. Die Ausführung über HTTP, wie Sie es hier tun, ist eine billige und einfache Technik. Ich verwende sie selbst. Der Unterschied zu Cron besteht darin, dass der "Hintergrundprozess" sofort gestartet wird.

Dennoch ein paar Anmerkungen:

  1. Zuallererst sollten Sie Folgendes aufrufen ignore_user_abort() im Skript "Hintergrund". Andernfalls wird Ihr Skript in vielen Umgebungen abgebrochen, wenn das "aufrufende" Skript den Socket schließt.

  2. Zweitens: Sie können die $_SERVER['HOST'] Variable im "Hintergrund"-Skript, und auf diese Weise können Sie Skripte haben, die nicht dem Internet ausgesetzt sind (grundsätzlich Anfragen an localhost und prüfen Sie dies im Hintergrundskript). Sie können dann vermutlich Anfragen vertrauen, die von Ihrem eigenen Rechner kommen, und alle Sicherheitsüberprüfungen, Sitzungen usw. überspringen.

  3. Drittens: Wer sagt, dass das "Hintergrund"-Skript mit PHP ausgeführt werden muss? PHP hat viele Schwächen, wenn man es als "Hintergrundprozess" verwenden will. Die größte Schwäche ist, dass es bei E/A blockiert. Wenn Sie also E-Mails versenden, Datenbankzeilen aktualisieren oder was auch immer, halten Sie Ihr Skript im Grunde jedes Mal an, wenn Sie eine Anfrage senden. Mit Node.js hingegen können Sie beispielsweise E/A-Befehle asynchron abfeuern und weiterarbeiten. Wenn Sie PHP verwenden, sollten Sie zumindest dafür sorgen, dass Sie 10 E-Mails gleichzeitig versenden oder 10 Zeilen gleichzeitig aktualisieren.

  4. Schließlich möchten Sie vielleicht einen Fortschrittsbalken im Browser anzeigen, wenn ein Hintergrundskript etwas tut. Sie müssen also einen gemeinsamen Datenspeicher (wie Ihre Datenbank) verwenden, um den Fortschritt der Aufgabe aufzuzeichnen.

1voto

Das ist eine funktionale, aber seltsame Lösung, die sicherstellt, dass Sie Ihren Rechner den ganzen Tag über angeschlossen haben müssen, um das erste Skript auszuführen. Wenn Sie das wollen, würde ich Ihnen empfehlen, ein Shell-Skript mit wget oder curl für diesen Zweck zu verwenden.

Zum Beispiel:

#!/bin/sh

curl -O http://www.myserver.com/cron.php 2>&1 > /var/log/remote.cron.log

Aber ich denke, die Lösung, die Sie gerne implementieren würden, wenn Sie nicht sehr syncronizedly laufen lassen müssen, ist eine Überprüfung am Ende Ihrer index.php, um zu sehen, wann es das Skript das letzte Mal ausgeführt hat, wenn es mehr als zwei Stunden her war, dann include('cron.php') . Sie können auch den Zeitstempel für die Ausführung des Skripts in einer Umgebungsvariablen speichern, um Leistungseinbußen zu vermeiden.

1voto

Klinky Punkte 2066

Soweit ich das nach dem Lesen des Blogbeitrags und dem Betrachten des Codes verstanden habe, ist dies nicht wirklich ein Weg, um den Cron-Zugriff zu umgehen, sondern ein Weg, um zu vermeiden, dass jemand auf eine lange Anfrage wartet, bis der Server geantwortet hat. Wenn Sie unbedingt ein bestimmtes Skript ausführen lassen müssen, z. B. alle 10 Minuten oder so, dann müssen Sie cron verwenden. Wenn Sie nur vermeiden wollen, dass Benutzer auf die Beendigung einer langen Abfrage warten müssen, könnte dieser Hack funktionieren. Auch mit dieser Methode werden Sie an Zeitgrenzen stoßen, wenn Ihr Skript länger braucht, als PHP erlaubt.

Wenn man sich die wp-cron.php (die im Blog-Link erwähnt wird) ansieht, sieht es so aus, als ob sie sich vollständig darauf verlässt, dass die Benutzer, die die Website besuchen, Prüfungen anhand einer Reihe von Aufträgen mit Zeitstempel auslösen.

Diese Techniken sind nicht sehr zuverlässig, es sei denn, Sie haben einen anderen Server, der in bestimmten Intervallen pingt. Das Hauptziel dieser Technik ist es, zu vermeiden, dass ein Benutzer z.B. 15 Sekunden warten muss, bis Reinigungs- oder Wartungsskripte ab und zu ausgeführt werden, und ist kein echter Ersatz für alle Cron-Anwendungen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X