2010-11-25 4 views
0

Ich habe ein CakePHP-Skript, das hoffentlich von einem Cron-Job ausgeführt werden soll. Es läuft gut von der Kommandozeile, aber scheinbar nicht von der Cron. Die Cron-Linie ist so etwas wie:PHP-Skript funktioniert von der Befehlszeile, nicht von Cron

*/2 * * * * cd /path/to/app;../cake/console/cake do_update 

Das Skript selbst - und das ist das Bit, das ich denke, vielleicht zu verrückt sein kann, um das Ausmaß des die Cron Abwerfen - Schleifen durch eine Teilmenge einer Realtors Tabelle in die Datenbank, um die Systemzeit zu entscheiden, welche 50-Rekord Scheibe der Datenbank zu aktualisieren:

$realtors = $this->Realtor->find('all',array(
'conditions'=>array('Realtor.zone_id'=>1), 
'order'=>array('Realtor.num DESC'), 
'limit'=>50, 
'offset'=>date("i")*25 
)); 

meine Frage (n) ist/sind also - ist es etwas, was ich hier mache, dass offensichtlich die werfen würde Cron Job für eine Schleife? Und, vielleicht noch wichtiger, ist meine Methode, eine Datenbank in überschaubare Stücke aufzuteilen, im Laufe einer Stunde verrückt? (Ich bin ein Programmierneuling, also probiere ich viele Dinge aus, ohne zu wissen, ob sie gut sind oder nicht.) Kann jemand eine bessere Möglichkeit vorschlagen, eine große Anzahl von Datenbankeinträgen über einen Cron zu durchlaufen und zu aktualisieren? verhindert, dass die einzelnen Abfragen zu umfangreich für das System sind?

EDIT: es funktioniert nicht nur immer von der Kommandozeile aus, es funktioniert auch, wenn es von Cron-Skript auf einem anderen Server ausgeführt wird. Ich schätze, es gibt nur etwas auf dem Server versaut, also scheint es zweifelhaft, es gibt eine Code-bezogene Lösung! Ich werde nur eine Antwort aus den folgenden nützlichen Cron-bezogenen Erkenntnissen akzeptieren ...

Antwort

0

Im Allgemeinen würden Sie alle Sachen Befehlszeile

/path/to/cake/console/cron.sh

 
#!/bin/sh 
cd /path/to/app 
php ../cake/console/cake do_update 
 
*/2 * * * * sh /path/to/cake/cron.sh 

Normalerweise I don in eine Shell-Datei setzen ‚t kümmern uns um, wo die Anwendung tatsächlich beginnt (wenn ich verwende Dateien nicht) und tun nur

 
*/1 * * * * php /my/path/my_php.php 
-1

Ich bin nicht so vertraut mit Cron, aber ich dachte nicht, dass Sie zwei Befehle so zusammen ausführen könnten.

Sie könnten versuchen wollen:

*/2 * * * * cd /path/to/app && ../cake/console/cake do_update 

Dies werden die beiden Befehle führen zusammen zu laufen (da jeder Befehl eine Nummer zurückgibt Erfolg oder Misserfolg, um anzuzeigen, und im Falle des Scheiterns, ein Fehlercode)

Ich gehe davon aus, dass Ihre PHP-Datei auch die notwendigen # enthält! Zeile am Anfang zeigt auf den PHP-Interpreter, und dass die Dateiberechtigungen für die Ausführung von der Kommandozeile aus erlauben? (dh Sie können diese Anweisung oben nur buchstäblich ausführen, und es funktioniert)

+0

Bedenkt man, dass es nicht ohne die shebang auf meinem Produktions-Server funktioniert, und dass jede einzelne Skriptsprache macht genau das gleiche ... Ich denke, dass Sie die shebang müssen tun es sei denn, die Datei ist tatsächlich eine binäre ausführbare Datei. Ich habe vorne gesagt, dass ich cron nicht so gut kenne, und ich vermute, dass der Kuchen - eine CakePHP-Datei zu sein - tatsächlich den Shebang enthält?(Das nennt man Due Diligence bei der Überprüfung.) – Arantor

+0

@sberry Shebangs funktionieren gut für PHP-Skripte, es unterscheidet sich nicht von jeder anderen Skriptsprache. Es wird nur weniger für PHP verwendet als beispielsweise für Perl-Skripte. – deceze

0

Ich würde versuchen, "cd /path/to/app;../cake/console/cake do_update" in Bash-Skript zu setzen und das Skript auszuführen in Cron stattdessen. Aber ich bin mir nicht sicher, ob es helfen wird.