Wenn mein Skript von diesem Cron-Job ausgeführt wird, wird die PHP-Konstante PHP_SAPI entspricht ‘cgi-fcgi’. Warum tut PHP_SAPI nicht gleich ‘cli’?
Ist es stets cgi-fcgi oder ist es cli, wenn Sie es selbst von dieser Befehlszeile auf dem Server ausführen? Wenn ja, was passiert beim Laufen? which php als Sie selbst gegen den Cron-Benutzer?
– Mike B
4. Juni 2012 um 18:58 Uhr
Das war das Problem. which php vom cron zurückgegeben /usr/bin/php während von mir in der Schale zurückgekehrt /usr/local/bin/php. Also habe ich letzteres in meinem Cron angegeben und alles ist gut.
– Tschad
4. Juni 2012 um 19:17 Uhr
Es tut mir leid, dass ich nicht antworten kann, da dies als zu lokalisiert geschlossen ist, aber ich habe eine nette Funktion gefunden, um zu überprüfen, ob das Skript von cli aufgerufen wird, selbst wenn PHP im cgi-fcgi-Modus ausgeführt wird: binarytides.com/php-check-running-cli
– Stefan
29. Mai 2015 um 6:59 Uhr
Dies ist nicht zu lokalisiert und hätte nicht geschlossen werden dürfen. Cli-Skripte (einschließlich Cron), die PHP aufrufen, geben oft „cgi“ oder „cgi-fcgi“ und gelegentlich andere Varianten zurück. Dies passiert die ganze Zeit. Ich vermute, es wurde geschlossen, weil jemand auf die Tags geschaut hat und vorschnell zu einem Schluss gekommen ist, anstatt wirklich etwas über die Angelegenheit zu wissen.
– mopsyd
21. November 2017 um 7:59 Uhr
Das wird dein Problem aber lösen: if ( php_sapi_name() == 'cli' || strpos( php_sapi_name(), 'cgi' !== false) { /*command line*/} else { /*http*/ }. Das ist alles, was Sie brauchen.
Das php_sapi_name() Die Funktion ist äußerst nützlich, wenn Sie den Typ der Schnittstelle bestimmen möchten. Es gibt jedoch noch einen weiteren Fallstrick, den Sie beachten müssen, wenn Sie Ihre Anwendung entwerfen oder auf einem unbekannten Server bereitstellen.
Wann immer etwas von der Art der Schnittstelle abhängt, stellen Sie sicher, dass Ihre Prüfung aussagekräftig ist. Vor allem, wenn Sie das Command Line Interface (CLI) vom Common Gateway Interface (CGI) unterscheiden möchten.
Notiere dass der php-cgi Binary kann von der Kommandozeile, von einem Shell-Skript oder auch als Cron-Job aufgerufen werden! Wenn ja, die php_sapi_name() gibt immer denselben Wert zurück (dh “cgi-fcgi“) Anstatt von “cli„was man erwarten kann.
Erwarten Sie nicht immer /usr/bin/php ein Link zu sein php-cli binär.
Zum Glück ist der Inhalt der $_SERVER und die $_ENV superglobale Arrays hängt davon ab, ob die php-cgi Binär wird von der Befehlszeilenschnittstelle (durch ein Shell-Skript, durch den Cron-Job usw.) oder durch einen HTTP-Server (z. B. Lighttpd) aufgerufen.
Alle Anerkennung geht dafür an @mopsyd, aber da die einzige Antwort keine Lösung bietet, möchte ich dies hier posten, damit es leicht lesbar ist, anstatt die Kommentare durchsehen zu müssen.
tl;dr: Sie haben cPanel installiert, das PHP-Binärdateien durch Perl-Skripte ersetzt.
Verwenden Sie /usr/local/bin/php anstelle von /usr/bin/php.
Ist es stets cgi-fcgi oder ist es cli, wenn Sie es selbst von dieser Befehlszeile auf dem Server ausführen? Wenn ja, was passiert beim Laufen?
which php
als Sie selbst gegen den Cron-Benutzer?– Mike B
4. Juni 2012 um 18:58 Uhr
Das war das Problem.
which php
vom cron zurückgegeben/usr/bin/php
während von mir in der Schale zurückgekehrt/usr/local/bin/php
. Also habe ich letzteres in meinem Cron angegeben und alles ist gut.– Tschad
4. Juni 2012 um 19:17 Uhr
Es tut mir leid, dass ich nicht antworten kann, da dies als zu lokalisiert geschlossen ist, aber ich habe eine nette Funktion gefunden, um zu überprüfen, ob das Skript von cli aufgerufen wird, selbst wenn PHP im cgi-fcgi-Modus ausgeführt wird: binarytides.com/php-check-running-cli
– Stefan
29. Mai 2015 um 6:59 Uhr
Dies ist nicht zu lokalisiert und hätte nicht geschlossen werden dürfen. Cli-Skripte (einschließlich Cron), die PHP aufrufen, geben oft „cgi“ oder „cgi-fcgi“ und gelegentlich andere Varianten zurück. Dies passiert die ganze Zeit. Ich vermute, es wurde geschlossen, weil jemand auf die Tags geschaut hat und vorschnell zu einem Schluss gekommen ist, anstatt wirklich etwas über die Angelegenheit zu wissen.
– mopsyd
21. November 2017 um 7:59 Uhr
Das wird dein Problem aber lösen:
if ( php_sapi_name() == 'cli' || strpos( php_sapi_name(), 'cgi' !== false) { /*command line*/} else { /*http*/ }
. Das ist alles, was Sie brauchen.– mopsyd
21. November 2017 um 8:00 Uhr