2016-05-05 10 views
4

ich einen Cron-Job für Laravel 5.2Artisan :: call() außerhalb des Laravel Rahmen

Mein Hostern (auf OVH) erstellen möchten, können nur mich auf den vollständigen Pfad einer Datei zeigen, und ich bin nicht in der Lage die empfohlene Cron Eintrag von Laravel der docs zu verwenden, das heißt:

* * * * * php /path/to/artisan schedule:run >> /dev/null 2>&1 

Deshalb habe ich die Artisan-Befehl von einem php-Datei aufrufen, außerhalb des Laravel Rahmen.

Hier ist, was meine public/cron.php Datei wie bisher aussieht:

<?php 

require __DIR__.'/../bootstrap/autoload.php'; 

use Illuminate\Support\Facades\Artisan; 

Artisan::call('refresh'); 

refresh mein Befehl ist für die Thumbnails in meinem App regenerieren.

Wenn cron.php durch meinen Browser (Prüfung auf lokale XAMPP) zugreift, der folgende Fehler auftritt:

Fatal error: Uncaught RuntimeException: A facade root has not been set. in 
C:\xampp\htdocs\site\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php:210 

Stack trace: 
#0 C:\xampp\htdocs\site\public\cron.php(7): Illuminate\Support\Facades\Facade::__callStatic('call', Array) 
#1 {main} thrown in C:\xampp\htdocs\site\vendor\laravel\framework\src\Illuminate\Support\Facades\Facade.php on line 210 

Ich habe auch versucht, die App zu starten, aber es macht nicht Unterschiede

$app = require_once __DIR__.'/../bootstrap/app.php'; 
$app->boot(); 

mit der Artisan Fassade zu vermeiden, habe ich versucht, die underl Aufruf ying Kernel Klasse direkt:

use Illuminate\Contracts\Console\Kernel; 

$kernel = new Kernel; 
$kernel->call('refresh'); 

Aber dies zurück:

Uncaught Error: Cannot instantiate interface Illuminate\Contracts\Console\Kernel 

EDIT: Hier ist ein Screenshot von OVH cron-Schnittstelle. Die Cron-Aufgabe wird von OVH angepasst und erlaubt nur, auf den Vollpfad-URI einer Datei zu zeigen - welche Datei würde meinen Handwerkerbefehl ausführen. Meine Frage ist, was soll ich in diese Datei schreiben, und sollte es eine PHP-Datei oder ein CMD sein?

OVH cron interface

+0

Sie können Ihre crontab also nicht mit 'crontab -e' bearbeiten? Wie werden Sie Ihre Datei in regelmäßigen Abständen ausführen, wenn Sie keine Cronjobs erstellen können? – codedge

+0

@codedge OP sagte, er besitzt ein Shared Hosting bei OVH. Mit OVH können Kunden Cron-Jobs in ihrem Manager erstellen. 'crontab -e' ist nur eine Verknüpfung zum Öffnen '/ var/spool/cron/crontabs/' mit dem bevorzugten Texteditor. Es gibt viele andere Möglichkeiten, einige Inhalte in diese Datei zu stellen. Offensichtlich kann ein Skript auch damit umgehen. – Arcesilas

+0

Ich aktualisierte die Frage – PhilMarc

Antwort

7

Sie möchten einen bestimmten Artisan-Befehl in einem Skript ausführen.

können Sie dies erreichen, indem artisan.php Kopieren und zwingt den Eingang zu dem, was Sie wollen:

#!/usr/bin/env php 
<?php 

require __DIR__.'/bootstrap/autoload.php'; 

$app = require_once __DIR__.'/bootstrap/app.php'; 

$kernel = $app->make(Illuminate\Contracts\Console\Kernel::class); 

$status = $kernel->handle(
    $input = new Symfony\Component\Console\Input\ArrayInput(['command' => 'refresh']), 
    new Symfony\Component\Console\Output\ConsoleOutput 
); 

$kernel->terminate($input, $status); 

exit($status); 

Wenn Sie dieses Skript zu vergleichen, um artisan.php, werden Sie sehen, dass ich nur die Eingabe übergeben gezwungen haben zu $kernel->handle() Methode. Es liest die Eingabe von der CLI nicht mehr, es nimmt diese Argumente als ein Array. Weitere Informationen finden Sie unter Symfony Console Component documentation.

Wenn Sie Argumente an das Skript übergeben müssen, setzen Sie einfach den Eingang entsprechend:

$input = new Symfony\Component\Console\Input\ArrayInput([ 
    'command' => 'refresh', 
    'arg_foo' => 'foo', 
    '--option_bar' => 42 
]); 

$status = $kernel->handle(
    $input, 
    new Symfony\Component\Console\Output\ConsoleOutput 
); 

Jetzt können Sie dieses Skript setzen, wo Sie wollen, es muss nicht über einen Browser über das Web zugänglich sein (Es sollte übrigens nicht).

Wenn Sie es an der Wurzel Ihres Hosting bei OVH setzen, meine ich NICHT in www, man muss nur das Formular ausfüllen sehr einfach:

OVH Shared Hosting Cronjob - Step 1

Wenn Sie Ihr Skript wollen zugänglich sein über das Web (was aus offensichtlichen Sicherheitsgründen nicht empfohlen wird, aber trotzdem), legen Sie es in Ihr Verzeichnis www, ändern Sie die Pfade zu bootstrap/autoload.php und bootstrap/app.php und geben Sie Ihrem Skript einen Namen, der nicht leicht zu erraten ist.

In der Form im OVH-Manager, vergessen Sie nicht www/ am Anfang des Pfades des Skripts hinzuzufügen.

Es ist nicht erforderlich, php script_name anzugeben, da der Manager es für Sie handhabt, wenn Sie PHP-Version wählen. Geben Sie einfach den Pfad des Skripts ein, das PHP ausführen soll.

+0

Merci! Genau das habe ich gesucht. Sehr klare Schritt für Schritt Erklärung, alles funktioniert perfekt. – PhilMarc

+0

Ich muss noch 3 Stunden warten, bis ich das Kopfgeld ausliefern kann, aber du wirst es definitiv bekommen;) – PhilMarc

+0

Danke! Froh, dass es geholfen hat! – Arcesilas

0

Wenn Sie nur einen cron-Job festlegen möchten. Bitte bearbeiten Sie crontab und verwenden Sie "Ihr/app/path/php artisan cron: job", um Ihren Befehl direkt auszugeben.

0

Probieren Sie einfach:

shell_exec('php artisan refresh'); 

Wenn es nicht funktioniert, versuchen entsprechenden Pfade sowohl zu php und artisan hinzuzufügen.

+0

Das funktioniert perfekt auf meinem localhost, aber wenn ich die Produktion probiere, "bricht" es die Website und ich dann Ich bekomme zufällige 500 Fehler beim Browsen. Hier sind die Protokolle vom Host: 'FastCGI: comm mit Server" /home/xxx.com/public/cron-refresh.php "abgebrochen: Leerlauf-Timeout (300 sec)' 'FastCGI: unvollständige Header (0 Bytes) empfangen vom Server "/home/xxx.com/public/cron-refresh.php" ' ' FastCGI: Ein Fehler ist bei Fastcgi-Verarbeitung aufgetreten, Fallback zu CGI' – PhilMarc