2010-06-25 17 views
19

que tienen una tarea programada que debe incluir este archivo:PHP: ¿La ruta requerida no funciona para el trabajo cron?

require '../includes/common.php'; 

Sin embargo, cuando se ejecuta a través del trabajo de cron (y no mi prueba local), la ruta relativa no funciona. la tarea cron ejecuta el siguiente archivo (en el servidor en vivo):

/home/username123/public_html/cron/mycronjob.php 

y aquí está el error:

Fatal error: require(): Failed opening required '../includes/common.php' 
(include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/username123/public_html/cron/mycronjob.php on line 2 

utilizando el mismo formato absoluta como el trabajo de cron, common.php estaría ubicado en

/home/username123/public_html/includes/common.php 

¿eso significa que tengo que cambiar mi línea 2 con:

require '/home/username123/public_html/includes/common.php'; 

?

gracias!

+0

posible duplicado de [ruta relativa no trabaja en script PHP cron] (http://stackoverflow.com/questions/1969374/relative-path-not-working-in-cron-php-script) –

+1

intento: chdir (__ DIR__); de: [http: // stackoverflow.com/preguntas/5254000 /-php-how-to set-corriente-trabajo-directorio-a-ser-mismo-como-directorio-ejecución-la] [1] [1]: http://stackoverflow.com/questions/5254000/php-how-to-set-current-working-directory-to-be-same-as-directory-executing-the –

Respuesta

22

Visto técnicamente el script php se ejecuta donde se encuentra cron; ex. Si cron estaba en/bin/cron, entonces esta declaración buscaría common.php en /bin/includes/common.php.

Así que sí, es probable que tenga que utilizar fullpaths o utilizar set_include_path

set_include_path('/home/username123/public_html/includes/'); 
require 'common.php'; 
+0

para facilitar la depuración, ¿puedo decir esto ?: \t if (file_exists ('/ home/username123/public_html/includes/common.php')) { \t \t set_include_path ('/ home/username123/public_html/includes /'); \t \t requieren 'common.php'; \t} else \t \t requieren '../includes/common.php'; o tengo que cambiar manualmente cada vez y hacer esto: // \t VIVO \t set_include_path ('/ home/fini7463/public_html/includes /'); \t requieren 'common.php'; \t // DEBUG \t // requieren '../includes/common.php'; ? – gsquare567

+0

Supongo que el primero debería estar bien – Robus

20

nono. necesitas usar rutas absolutas en crons.

lo que hago es:

// supouse your cron is on app/cron and your lib is on app/lib 
$base = dirname(dirname(__FILE__)); // now $base contains "app" 

include_once($base . '/lib/db.inc'); 

// move on 
+1

No, no ... pero debes tener en cuenta el hecho de que podrías estar ejecutando en un directorio diferente, y con un include_path diferente –

+0

, sí, tienes razón, creo que mejor redacción podría ser * es recomendable * en su lugar * necesita *. bueno, siempre trato de hacer eso –

+0

Esta debería ser la respuesta aceptada – karancan

0

Si la ruta relativa no funciona, entonces significa que el conjunto directorio actual cuando las tareas cron se están ejecutando no es/home/username123/public_html. En tales casos, solo puede usar una ruta absoluta.

0

Suena tan simple como que solo un script que está ejecutando está configurando el include_path y está incluyendo ese script. use phpinfo() para verificar la configuración include_path global vs local.

0

Una alternativa a las soluciones que recomiendan la especificación de ruta absoluta es usar un chdir en su secuencia de comandos. De esa forma, sus rutas relativas funcionarán como se espera.

Por ejemplo, para cambiar al directorio del script:

$curr_dir = dirname(__FILE__); 
chdir($curr_dir); 

Para cambiar al directorio principal del guión:

$curr_dir = dirname(__FILE__); 
chdir($curr_dir . "/.."); 

Y así sucesivamente.

Cuestiones relacionadas