Dez
13
Bei der Entwicklung von Internetauftritten wird es immer wichtiger mit nächtlichen Cronjobs zu arbeiten, diese einem die Arbeit der Datenvalidierung oder Datenerfassung erleichtern.
Da die Kunden nicht immer über einen Managed- oder RootServer verfügen, ist es kaum möglich mit der CakePHP-Console zu arbeiten. Über die CakePHP-Console lassen sich Models, Views, Controller und auch die wichtigen Shells entwickeln.
Eine Shell ist dazu da, um kommandozeilenbaiserende Skripte zu schreiben, diese aber vom Benutzer entfernt bleiben.
Wie oben bereits angesprochen, z.B. die Datenvalidierung oder ein nächtlicher Export von Datensätzen als CSV-Datei.
Ein Export der Datenbank kann u.a. bei APIs oder Shopsystemen sehr vorteilhaft sein.
Um auch die CakePHP-Shell auf einem Shared-Host / Shared-Server via HTTP-Request ausführen zu können,
muss der PHP-Befehl "exec()" aktiviert sein. Darüber lassen sich in einem PHP-Skript diverse Kommandozeilen starten.
In unserem Fall auch die CakePHP-Shell und das als HTTP-Request.
Natürlich ist es wichtig, dass ihr eure PHP-Skripte dementsprechend vor Fremdeingriffe schützt.
Eine .htaccess Authentifizierung oder PHP_AUTH-Methode wäre hier angebracht. Viele Cronjob-Dienste können die HTTP-Requests auch mit einem Benutzernamen und Passwort übersenden. Das PHP-Modul cUrl macht es möglich.
Wie führe ich die CakePHP-Shell in einem PHP-Skript aus?
Beim Hoster all-inkl muss der exec()-Befehl vorher durch eine .htaccess mit " AddHandler php-fastcgi .php" Datei freigeschaltet werden.
Die Cronjob.php-Datei legt ihr in das Verzeichnis "/app/webroot/_cronjob/" ab.
Den Ordner "_cronjob" müsst ihr vorher anlegen. - Darin wird auch die "log.txt" geschrieben.
Bei " here_comes_the_vendors_shell_file" wird die CakePHP-Shell-Datei angegeben. Z.B.: csv_export, diese im Verzeichnis /app/vendors/shells/csv_export.php" liegt.
<?php
$app_dir = dirname(dirname(dirname(__FILE__))); // app Path
$cake_dir = dirname(dirname(dirname(dirname(__FILE__)))); // cake-core Path
$logfile = $app_dir."/webroot/_cronjobs/log.txt"; // Log-File Path define(RECEIVER,'email@domain.de');
define(EMAIL_SUBJECT, 'CakePHP SHELL Cronjob');$command = "php ".$cake_dir."/cake/console/cake.php -app ".$app_dir."/ -core ".$cake_dir."/cake/ -i cake here_comes_the_vendors_shell_file > ".$logfile; // exec command with cakephp-shell exec($command);
// get log.txt content for e-mail-body
$msg = file_get_contents($logfile);
mail(RECEIVER,EMAIL_SUBJECT,$msg); // send mail to defined receiver
?>
Die Ausgabe der Shell wird in eine Datei umgelenkt und bei jedem Aufruf neu geschrieben.
Eine E-Mail an einen oben definierten Empfänger wird mit genau diesem Inhalt verschickt.
Wie führe ich die CakePHP-Shell auf einem Managed- oder RootServer aus?
Hierzu gibt es eine sehr ausführliche Dokumentation auf book.cakephp.org.