2009-04-12 6 views
1

Ich habe eine Datei "update.php", die einige MySQL-Operationen ausführt. Ein Cron-Job führt diese Datei alle 5 Minuten aus. Leider kann ich den Cron-Job nicht öfter ausführen.Wie kann ich meinen PHP-basierten Cron-Job öfter ausführen lassen?

So hatte ich die Idee, dass ich hinzufügen könnte ...

<html> 
<head> 
    <meta http-equiv="refresh" content="2; URL=<?php echo $_SERVER['SCRIPT_NAME']; ?>" /> 
</head> 
<body></body> 
</html> 

... auf der Seite "update.php". Wird Cron die Datei so ausführen, dass die Seite automatisch aktualisiert wird? Oder wird das nicht passieren, weil es keinen Client mit einem Browser gibt?

Wenn es die Meta-Aktualisierung hat keine Wirkung, gibt es eine andere Möglichkeit, die Aktualisierung der Seite zu erreichen?

Vielen Dank im Voraus!

+0

Interessiert zu hören, warum dies abgelehnt wird? – madcolor

Antwort

11

Ich habe Angst, dass won direkt Ihre Seite (wget, netcat, etc ...) ins Leben gerufen Aufruf sein‘ Es funktioniert, weil es eine Browserfunktion ist, um die Seite zu aktualisieren.

Frage: Warum können Sie den Cronjob nicht so einstellen, dass er häufiger alle 5 Minuten ausgeführt wird?

Wenn es keine andere Option gibt, könnten Sie einen eigenen Daemon erstellen, um den Job häufiger auszuführen.

z.B. Ihre PHP-Skript könnte:

  • Run
  • 60 Sekunden warten
  • Run
  • (Warte; Run; zwei weitere Male)
  • Ausfahrt

Zum Beispiel: (By Variation des Codes sshow)

<?php 

$secs = 60; 

ignore_user_abort(true); 
set_time_limit(0); 

dostuff(); 
sleep($secs); 
dostuff(); 
sleep($secs); 
dostuff(); 
sleep($secs); 
dostuff(); 
sleep($secs); 
dostuff(); 

?> 

Diese Version des Skripts bleibt für vier Minuten resident und führt den Code viermal aus, was einer Ausführung pro Minute entsprechen würde, wenn dieses Skript alle fünf Minuten von cron ausgeführt wird.

Es scheint etwas Verwirrung darüber zu geben, was ein Cronjob ist und wie es ausgeführt wird.

cron ist ein Daemon, der sich im Hintergrund befindet und Tasks über die Shell zu einem in crontab angegebenen Zeitplan ausführt.

Jeder Benutzer hat eine Crontab, und es gibt ein System Crontab.

Die crontab jedes Benutzers kann Jobs angeben, die als dieser Benutzer ausgeführt werden.

Zum Beispiel:

# run five minutes after midnight, every day 
5 0 * * *  $HOME/bin/daily.job >> $HOME/tmp/out 2>&1 
# run at 2:15pm on the first of every month -- output mailed to paul 
15 14 1 * *  $HOME/bin/monthly 
# run at 10 pm on weekdays, annoy Joe 
0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?% 
23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday" 
5 4 * * sun  echo "run at 5 after 4 every sunday" 

So alle fünf Minuten laufen:

*/5 * * * *  echo "This will be run every five minutes" 

Oder jede Minute auszuführen:

* * * * *  echo "This will be run every minute" 

Die Ausgabe der Befehle an die per E-Mail Besitzer der Crontab (oder wie von MAILTO angegeben). Dies bedeutet, dass Sie jede Minute eine E-Mail erhalten, wenn Sie jede Minute etwas ausführen, außer Sie stellen sicher, dass alle normalen Ausgaben unterdrückt oder umgeleitet werden.

Die Befehle werden als der Benutzer ausgeführt, der die Crontab besitzt, die im Gegensatz zu den vom Webserver ausgeführten Skripts steht, die als Benutzer 'nobody' (oder ähnlich) ausgeführt werden, unabhängig davon, welcher Webserver konfiguriert ist wie). Dies kann das Leben komplizierter machen, wenn der Cronjob in Dateien schreibt, auf die die vom Webserver ausgeführten Skripte zugreifen sollen. Grundsätzlich müssen Sie sicherstellen, dass die Berechtigungen korrekt sind.

Nun bin ich mir nicht sicher, dass dies das System ist, auf das Sie sich beziehen. Wenn Sie etwas anderes unter cronjob meinen, dann trifft das oben nicht zu.

Wenn Sie etwas tun möchten, was Ihr aktueller Host Ihnen nicht erlaubt, dann sollten Sie, anstatt die Beschränkung zu hacken, den Hosting Provider wechseln.


Eine Alternative ist, um das Skript zu setzen in Sie normale Skripte Lage sind, und haben einige externe Scheduler laufen wget dagegen egal auf welcher Frequenz Sie mögen.


Eine weitere Alternative ist On-Demand-Aktualisierung der Form von vartec ‚s Vorschlag. Dies kann jedoch Ihre Probleme nicht lösen.

+0

Danke! Also muss ich einen anderen Weg wählen, um es zu erreichen. Ihr Vorschlag scheint zu funktionieren. Es gibt jedoch ein Limit für gleichzeitig ausgeführte Skripte auf meinem Server, denke ich. Und da ist die max. Ausführungszeit. Das Skript würde dann non-stop ausgeführt werden (Limit-1). Wird es aber funktionieren? – caw

+0

Es sollte immer nur eine Kopie dieses Skripts ausgeführt werden (jede Kopie sollte nach 5 Minuten beendet werden) (Sie können es vier Minuten dauern, um sicher zu gehen). Und was ist die Durchsetzung der max. Ausführungszeit? Wenn es Apache ist, ist das egal, da dies außerhalb von Apache läuft. –

+0

OK, danke. Ich dachte, dass es das Maximum durchsetzt. Ausführungszeit weil: Das Skript läuft für 6 Sekunden, dann schläft es für 45 Sekunden. Mit einer Schleife wiederholst du dies fünf Mal. Du hast also einen Cronjob, der einmal pro Minute läuft. Die Ruhezeit zählt nicht, aber 6x6 = 36 Sekunden ist die Ausführungszeit (max. 30). – caw

-2

Was Sie zu tun versuchen, bedeutet Benutzerinteraktion, also was, wenn kein Kunde Ihre "Seite" betritt?

Zum Beispiel Servlets und EJB Container können es programmatisch bei Container Start tun, was Sie brauchen, also nehme ich an, dass für PHP die einzige Möglichkeit, "automatisch" cronlike Jobs zu erreichen, einige Änderungen in Ihrem Apache Quellcode vorzunehmen, natürlich nur wenn Sie einen Gehäuse-Server verwenden.

Eine praticable Option nicht contempling Code-Änderungen könnten einige cron-Skript während Ihrer Web-Server-Start

1

Aktualisierung: Editierte basierend auf neuen Informationen.

Meta-Aktualisierung funktioniert nicht, weil cronjob.de ein automatisiertes System verwendet, das den Inhalt der Seite nicht wirklich liest. Kein Browser, also nichts, um die Meta-Aktualisierung zu sehen.

Sie haben ein paar Optionen. Sie variieren in mehr oder weniger schrecklicher Weise.

Die beste Option ist es, Webhosts zu ändern. Ein guter Webhost wird volle Unterstützung für Cron haben. Aber wenn du Cron anfassen musst, solltest du wahrscheinlich sowieso auf einem VPS-Host sein. Viele Hosts werden gegen eine Cron-Task, die jede Minute ausgeführt wird, Einwände erheben, es sei denn, die Task aktualisiert gerade etwas sehr schnell und beendet sich. Aber VPS-Hosts wird es normalerweise nicht kümmern. Slicehost bietet VPS-Server für nur $ 20/Monat. Nicht empfohlen für Personen, die zuvor noch keinen Root-Zugriff hatten.

Die einzige Option, die Sie mit der 5-Minuten-Beschränkung von cronjob.de verwenden können, besteht darin, eine Schleife zu erstellen, die eine Iteration ausführt, schläft, eine weitere Iteration ausführt und vor dem Ende der Schleife wiederholt 5 Minuten. Bei diesem Ansatz gibt es jedoch zwei große Probleme.Erstens, wenn Sie eine Anfrage haben, die 4 Minuten dauert, besteht eine deutliche Möglichkeit, dass Ihr Webhost die Anfrage möglicherweise abbricht, bevor sie beendet wird. Zweitens, wenn der Webserver nicht richtig konfiguriert ist, blockiert eine solche Anfrage möglicherweise andere Anfragen und verhindert, dass legitime Benutzer auf Ihre Site zugreifen - sie würden sich anstellen und darauf warten, dass die cronjob.de-Anfrage beendet wird, bevor ihre Anfragen abgeschlossen werden können . Und da diese Anfrage 4-5 Minuten dauert, bevor sie eine Minute später wiederholt wird, können sie möglicherweise nur alle 5 Minuten auf Ihre Website zugreifen. Ich schätze, das ist nicht wünschenswert. Leider ist der einzige Weg zu wissen, ob Sie mit einem dieser Probleme in Konflikt geraten ist, fragen Sie Ihren Webhost. Ich empfehle nicht, es zu versuchen, bevor Sie fragen, weil sie es möglicherweise nicht schätzen, wenn es unerwartet schlecht geht und anfängt, ihre anderen Kunden auf dem Server zu beeinflussen.

Wenn Sie Glück haben, können sie sogar bereit sein, einen Cron-Job für Sie einzurichten.

+0

Danke für Ihre Antwort! Mein Webhost bietet keine Cronjobs an. Also benutze ich cronjob.de, einen deutschen Webservice, bei dem Sie URLs hinzufügen, die alle 5 Minuten geöffnet werden. Aber 5 Minuten sind nicht genug. Ich brauche ein kleineres Intervall. Also suche ich hier nach einer Lösung. – caw

+0

Ahhh, ja, das erklärt die Dinge ein bisschen mehr. In diesem Fall ist PHP keine völlig verrückte Idee. Dies sollte wahrscheinlich in der ursprünglichen Frage erwähnt worden sein. –

2

Ich würde sagen, versuchen Sie nicht, dies mit PHP zu tun, ändern Sie Ihre Crontab. Wenn Sie Ihre Anwendung benötigen, um jede Minute einen Cronjob zu machen, und Ihr Hosting diese Option nicht zur Verfügung stellt, sind Sie wahrscheinlich Ihrem Hosting entwachsen. Holen Sie sich ein VPS-Hosting für 20 $ pro Monat (Slicehost, Servergrove).

3

Ich bin mir ziemlich sicher, dass Sie es, indem Sie dies erreichen können:

<?php 

$secs = 120; 

ignore_user_abort(true); 
set_time_limit(0); 

while (true) 
{ 
    // do something 

    // Sleep for some time 
    sleep($secs); 
} 

?> 

bearbeiten

Sie es einmal nach jedem Neustart des Servers müssen ausführen, wenn Sie es wie Douglas tun beschreibt.

aktualisieren

Halten Antwort Douglas Leeder ist im Kopf und dann einen Blick auf diese:

http://www.php.net/manual/en/function.ignore-user-abort.php

+0

Danke! Ich habe es getestet - und es funktioniert. So kann ich ein Skript erstellen, das (fast) unbegrenzt läuft. Aber verletzt das den Server nicht? Ist der ignore_user_abort (true) wirklich notwendig? Wie kann PHP erkennen, dass der Benutzer die Seite geschlossen hat (der Client wurde getrennt)? – caw

+0

Egal ob es realisiert oder nicht. Es beendet nur die Ausführung nicht. – sshow

+0

Sie brauchen also nicht ignore_user_abort (true), oder? – caw

0

Sie PHP das Skript aufrufen können ...

<?php 
$script='/path/to/my/php/script.php'; 

ignore_user_abort(1); 
set_time_limit(0); 
$php=exec('which php'); 
while (1) { 
    if (file_exists($script)) { exec($php.' '.$script); } 
    else { file_get_contents($script); } 
    sleep(2); 
} 
?> 

Die Datei, die Sie $ script eingeben, muss existieren, andernfalls denkt es, dass es eine URL ist.

Es sollte den Trick tun.

+0

Vielen Dank für diese Antwort. Aber warum brauche ich exec()? Mein Skript, das aufgerufen werden sollte, ist ebenfalls PHP. Also kann ich include() verwenden oder nur eine einzige Datei verwenden. Recht? – caw

Verwandte Themen