2012-02-03 30 views
17

Quiero ejecutar un trabajo cron. Mi aplicación está desarrollada en PHP y Mysql.

En el navegador si uso $_SERVER[HTTP_HOST] en la codificación, funciona bien. Pero si uso lo mismo en el trabajo cron, está dando errores.

¿Puede alguien dar sugerencias para arreglar esto?

+0

sírvase citar algunos de mensajes de error de algún tipo. Tal vez $ _SERVER ['HTTP_HOST'] undefined debido a la secuencia de comandos cron no está definiendo ningún HTTP_HOST, como lo hacen los navegadores? Puede probarlo con isset ($ _ SERVER ['HTTP_HOST']) –

+0

php> = 5.3.0 use gethostname() – nick

Respuesta

16

$_SERVER['HTTP_HOST'] no está lleno cuando se ejecuta desde un cronjob, no se puede acceder al archivo a través de HTTP.

O bien tendrá que codificar el host o pasarlo a través de un argumento de línea de comandos y acceder a él a través de la matriz $_SERVER['argv'].

+0

Buena respuesta. Los scripts CLI tienen $ argv y $ argc globales a los que puede acceder, por lo que no es necesario usar $ _SERVER. –

+1

'$ argv' no está disponible en funciones sin la palabra clave global. '$ _SERVER' es superglobal. – TimWolla

2

Puede codificar el valor de $_SERVER[HTTP_HOST] si está vacío, o puede realizar otra comprobación.

6

Cuando se ejecuta php en la línea de comandos, $_SERVER['HTTP_HOST'] (por supuesto) no está disponible.

simplemente puede suprimir el error utilizando el signo @ o ser un poco más cauteloso utilizando una línea de construcción:

$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI'; 
6

Como se dijo anteriormente, $ _SERVER no está presente cuando se ejecuta PHP a través de php-cli.

Sin embargo, hay una opción para ejecutar sus scripts cron'd en php-cgi, donde tendrá $ _SERVER. Si se enrolla en un servidor web local, entonces $ _SERVER se completará.

$ cat /etc/cron.daily/mydailyphpwork 
/usr/bin/curl http://domain.tld/path/to/cron-script.php &> /dev/null 

Sin embargo, creo que debe de hecho seguir con las soluciones propuestas por TimWolla o Dervo, a menos que realmente necesita este comportamiento.

Pros:

  • Usted recibirá todos los $ _SERVER variables establecidas como se esperaba.
  • Si necesita reescribir una gran cantidad de código con if-else esto puede ser preferible ya que no necesita cambiar ningún código.

Contras:

  • Es una especie de solución y probablemente significa un ligero aumento de la carga de la CPU.
4

Prueba a ejecutar cron job con curl .. Completará tu $ _SERVER ['HTTP_HOST'].

sintaxis en Linux es como

curl http://yourdomain/yourfile.php 
+1

Esta fue la solución más directa en mi mente, siempre y cuando su archivo esté en una URL pública. AronCederholm también hizo una sugerencia similar, pero apoya a @alwaysLearn por responderla al grano. Esto funcionó perfecto para mí. – David

Cuestiones relacionadas