Warum ist PHP_SAPI nicht gleich ‘cli’, wenn es von einem Cron-Job aufgerufen wird?

Lesezeit: 3 Minuten

Chads Benutzeravatar
Tschad

Hier ist die Zeile von meinem Cron-Job …

*/5 * * * * php /home/user/public_html/index.php --uri=minion --task=emailassets

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.

    – mopsyd

    21. November 2017 um 8:00 Uhr

Benutzeravatar von gavintfn
gavintfn

Aus php.net-Handbuch:

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.

Das kannst du so testen:

$ diff /usr/bin/php /usr/local/bin/php
2c2
< # cpanel - php-cgi                                 Copyright 2018 cPanel, L.L.C.
---
> # cpanel - php-cli                                 Copyright 2018 cPanel, L.L.C.
7c7
< package ea_php_cli::cgi;
---
> package ea_php_cli::cli;
19c19
< my $bin = "php-cgi";
---
> my $bin = "php";

Wie Sie sehen können, wird /usr/bin/php für CGI-Anforderungen und /usr/local/bin/php für CLI-Befehle verwendet.

1434070cookie-checkWarum ist PHP_SAPI nicht gleich ‘cli’, wenn es von einem Cron-Job aufgerufen wird?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy