2010-01-20 17 views
22

Uso $ _SERVER ['DOCUMENT_ROOT']. "/ Lib/sft_required.php"; para incluir el archivo 'sft_required' en un script PHP. Cuando ejecuto este archivo usando el navegador, funciona bien, pero cuando lo ejecuto como un trabajo de trabajo de cron, no funciona. Parece que el archivo no está incluido cuando ejecutamos el script a través de cron.

Respuesta

23

Suponiendo que está ejecutando el script directamente a través de cron (a diferencia de un servidor web al que accedió una solicitud HTTP activada por un cronjob (por ejemplo, ejecutando cron wget)), por supuesto, no funciona.

No hay servidor, por lo que $_SERVER no está configurado.

+9

En realidad, el '$ _SERVER' superglobal está configurado pero contiene diferentes valores. –

+1

"por supuesto"? ¿Por qué el servidor "olvidaría" qué es 'DOCUMENT_ROOT'? No es tan obvio (en realidad, después de algunos años todavía no entiendo por qué DOC_ROOT está en blanco ('REMOTE_ADDR' etc. son más obvios) – Martijn

+0

@Martijn - El servidor no olvidará nada. El PHP no está siendo ejecutado por el servidor web, está siendo ejecutado por cron. – Quentin

7

$_SERVER no se puede esperar que contenga ninguno de los valores normales cuando se ejecuta un script PHP utilizando el intérprete CLI. Ponga la ruta en una variable de entorno o páselo al script como un argumento de línea de comando.

58

se podría poblar el $ _SERVER [ 'DOCUMENT_ROOT'] en su propia

$_SERVER['DOCUMENT_ROOT'] = dirname(__FILE__); 

si el archivo cron se encuentra en la raíz del documento

$_SERVER['DOCUMENT_ROOT'] = dirname(dirname(__FILE__)); 

si el archivo cron es un directorio por encima del documento raíz

+1

Esta respuesta debe marcarse como aceptada, ya que da una solución práctica a la pregunta del OP ... –

4

Respondí una pregunta similar here. Como han mencionado las personas, el superglobal $ _SERVER no está definido en situaciones de CLI. En el enlace hay un (hasta ahora) método infalible para obtener la ubicación DOCUMENT_ROOT. Espero que sea útil.

1
define('DOCROOT', substr(str_replace(pathinfo(__FILE__, PATHINFO_BASENAME), '', __FILE__), 0, -1)); 

Esto obtendrá los mismos datos que para $_SERVER['DOCUMENT_ROOT'] cronjobs.

+0

¿Por qué? -1 Esto funciona. – alimack

+0

demasiadas cosas para que resulte lo mismo que 'dirname (__FILE __) 'y, no resuelves ... –

1

Ejemplo 1:
/var/www/site.com/ - DOCUMENT_ROOT;
/var/www/site.com/ cron /script.php - script CRON PHP;

<?php 
/** DOCUMENT_ROOT -> /var/www/site.com/ */ 
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../'); 
?> 

Ejemplo 2:
/var/www/site.com/ - DOCUMENT_ROOT;
/var/www/site.com/ sub_dir/cron /script.php - script CRON PHP;

<?php 
/** DOCUMENT_ROOT -> /var/www/site.com/ */ 
$_SERVER['DOCUMENT_ROOT'] = realpath(dirname(__FILE__).'/../../'); 
?> 
Cuestiones relacionadas