¿Por qué PHP_SAPI no es igual a ‘cli’ cuando se llama desde un trabajo cron?

3 minutos de lectura

Avatar de usuario de Chad
Chad

Aquí está la línea de mi trabajo cron…

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

Cuando mi script se ejecuta desde este trabajo cron, la constante de PHP PHP_SAPI es igual a ‘cgi-fcgi’. Por que PHP_SAPI no es igual a ‘cli’?

  • Lo es siempre cgi-fcgi o es cli si lo ejecuta usted mismo desde esa línea de comando en el servidor? Si es así, ¿qué sucede cuando corres? which php como usted mismo vs el cron-usuario?

    – Mike B.

    4 de junio de 2012 a las 18:58


  • Ese era el problema. which php del cron devuelto /usr/bin/php mientras que de mí mismo en el caparazón regresó /usr/local/bin/php. Así que especifiqué esto último en mi cron y todo está bien.

    – Chad

    4 de junio de 2012 a las 19:17

  • Lamento no poder responder porque esto está cerrado como demasiado localizado, pero encontré una buena función para verificar si el script se llama desde cli incluso si php se está ejecutando en modo cgi-fcgi: binarytides.com/php-check-running-cli

    – steven

    29 de mayo de 2015 a las 6:59

  • Esto no está demasiado localizado y no debería haberse cerrado. Los scripts CLI (incluido cron) que invocan php a menudo devolverán ‘cgi’ o ‘cgi-fcgi’ y, ocasionalmente, otras variantes. Esto sucede todo el tiempo. Sospecho que se cerró porque alguien miró las etiquetas y llegó a una conclusión en lugar de saber nada sobre el asunto.

    – mopsyd

    21 de noviembre de 2017 a las 7:59


  • Sin embargo, esto resolverá tu problema: if ( php_sapi_name() == 'cli' || strpos( php_sapi_name(), 'cgi' !== false) { /*command line*/} else { /*http*/ }. Eso es todo lo que necesitas.

    – mopsyd

    21 de noviembre de 2017 a las 8:00

avatar de usuario de gavintfn
gavintfn

De manual de php.net:

los php_sapi_name() La función es extremadamente útil cuando desea determinar el tipo de interfaz. Sin embargo, hay un problema más que debe tener en cuenta al diseñar su aplicación o implementarla en un servidor desconocido.

Siempre que algo dependa del tipo de interfaz, asegúrese de que su verificación sea concluyente. Especialmente cuando desea distinguir la interfaz de línea de comandos (CLI) de la interfaz de puerta de enlace común (CGI).

Tenga en cuenta que el php-cgi Se puede llamar a binary desde la línea de comandos, desde un script de shell o también como un trabajo cron. Si es así, el php_sapi_name() siempre devolverá el mismo valor (es decir, “cgi-fcgi“) en vez de “cli” que se podía esperar.

No esperes siempre /usr/bin/php ser un enlace para php-cli binario.

Por suerte, el contenido de la $_SERVER y el $_ENV arreglos superglobales depende de si el php-cgi binary se llama desde la interfaz de línea de comandos (por un script de shell, por Cron Job, etc.) o por algún servidor HTTP (es decir, Lighttpd).

Todo el crédito es para @mopsyd por esto, pero dado que la única respuesta no brinda una solución, quiero publicar esto aquí para que sea fácil de leer en lugar de tener que revisar los comentarios.

tl; dr: tiene instalado cPanel, que reemplaza los binarios de PHP con scripts de Perl.

Utilice /usr/local/bin/php en lugar de /usr/bin/php.

Puedes probar esto así:

$ 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";

Como puede ver, /usr/bin/php se usa para solicitudes CGI y /usr/local/bin/php se usa para comandos CLI.

¿Ha sido útil esta solución?