tareas tab manager job example automatizar php cron

manager - php cron tab



La ruta relativa no funciona en el script cron PHP (8)

Además de la respuesta aceptada anterior, también puede utilizar:

chdir(__DIR__);

Si una secuencia de comandos PHP se ejecuta como una secuencia de comandos cron, las inclusiones suelen fallar si se utilizan rutas relativas. Por ejemplo, si tiene

require_once(''foo.php'');

el archivo foo.php se encontrará cuando se ejecute en la línea de comandos, pero no cuando se ejecute desde un script cron.

Una solución típica para esto es enviar primero el directorio de trabajo o usar rutas absolutas. Me gustaría saber, sin embargo, qué es diferente entre cron y shell que causa este comportamiento. ¿Por qué falla cuando se usan rutas relativas en un script cron?


Cambie el directorio de trabajo a la ruta del archivo en ejecución. Solo usa

chdir(dirname(__FILE__)); include_once ''../your_file_name.php''; //we can use relative path after changing directory

en el archivo en ejecución. Entonces no tendrá que cambiar todas las rutas relativas a rutas absolutas en cada página.


Cuando se ejecuta a través de un trabajo cron, su script PHP probablemente se ejecute en un contexto diferente que si lo inicia manualmente desde el shell. Así que sus caminos relativos no apuntan al camino correcto.


Debido a que el "directorio de trabajo actual" para las tareas cron será el directorio donde existe el archivo crontab, por lo que cualquier ruta relativa será relativa al directorio ESO.

La forma más sencilla de manejar eso es con la función dirname() y la constante PHP __FILE__ . De lo contrario, deberá editar el archivo con nuevas rutas absolutas cada vez que mueva el archivo a un directorio diferente o a un servidor con una estructura de archivos diferente.

dirname( __FILE__ )

__FILE__ es una constante definida por PHP como la ruta completa al archivo desde el que se llama. Incluso si el archivo está incluido, __FILE__ SIEMPRE se referirá a la ruta completa del archivo, no al archivo que incluye el archivo.

Por lo tanto, dirname( __FILE__ ) devuelve la ruta completa del directorio al directorio que contiene el archivo, sin importar desde dónde se incluya y basename( __FILE__ ) devuelve el nombre del archivo.

Ejemplo: Supongamos que "/home/user/public_html/index.php" incluye "/home/user/public_html/your_directory/your_php_file.php".

Si llama dirname( __FILE__ ) en "your_php_file.php", obtendrá "/ home / user / public_html / your_directory" devuelto aunque el script activo esté en "/ home / user / public_html" (note la ausencia de la barra diagonal final) ).

Si necesita el directorio del archivo INCLUYENDO use: dirname( $_SERVER[''PHP_SELF''] ) que devolverá "/ home / user / public_html" y es lo mismo que llamar a dirname( __FILE__ ) en el archivo "index.php" ya que los caminos relativos son los mismos.

usos de ejemplo:

@include dirname( __FILE__ ) . ''/your_include_directory/your_include_file.php''; @require dirname( __FILE__ ) . ''/../your_include_directory/your_include_file.php'';


El DIR funciona aunque no funcionará en mi host local, ya que tiene una ruta diferente a la de mi servidor de sitio en vivo. Utilicé esto para arreglarlo.

if(__DIR__ != ''/home/absolute/path/to/current/directory''){ // path for your live server require_once ''/relative/path/to/file''; }else{ require_once ''/absolute/path/to/file''; }


El directorio de trabajo del script puede ser diferente cuando se ejecuta desde un cron. Además, hubo cierta confusión sobre PHPs require () e include (), lo que causó confusión acerca de que el directorio de trabajo realmente era el problema:

include(''foo.php'') // searches for foo.php in the same directory as the current script include(''./foo.php'') // searches for foo.php in the current working directory include(''foo/bar.php'') // searches for foo/bar.php, relative to the directory of the current script include(''../bar.php'') // searches for bar.php, in the parent directory of the current working directory


La única oportunidad que tuve de "require_once" para trabajar con cron y apache al mismo tiempo fue

require_once(dirname(__FILE__) . ''/../setup.php'');


Otra posibilidad es que la versión CLI esté utilizando un archivo php.ini diferente. (De forma predeterminada, utilizará php-cli.ini y se recurrirá al php.ini estándar)

Además, si está utilizando archivos .htaccess para configurar la ruta de su biblioteca, etc. obviamente esto no funcionará a través del cli.