2012-02-03 13 views
17

Chcę uruchomić zadanie crona. Moja aplikacja jest rozwijana w PHP i MySQL.

W przeglądarce, jeśli używam $_SERVER[HTTP_HOST] w kodowaniu, działa dobrze. Ale jeśli użyję tego samego w pracy cron, to daje błędy.

Czy jakiekolwiek ciało może zaproponować rozwiązanie tego problemu?

+0

podaj jakiś error-przesłanie jakiegoś rodzaju. Może $ _SERVER ['HTTP_HOST'] undefined ze względu na skrypt cron nie definiuje żadnego HTTP_HOST, jak robią to przeglądarki? Możesz przetestować go za pomocą isset ($ _ SERVER ['HTTP_HOST']) –

+0

php> = 5.3.0 użyj gethostname() – nick

Odpowiedz

16

$_SERVER['HTTP_HOST'] nie jest wypełniany podczas uruchamiania z crona, plik nie jest dostępny przez HTTP.

Będziesz musiał albo zakodować kod hosta, albo przekazać go za pomocą argumentu wiersza poleceń i uzyskać do niego dostęp za pośrednictwem tablicy $_SERVER['argv'].

+0

Dobra odpowiedź. Skrypty CLI mają globalizatory $ argv i $ argc, do których można uzyskać dostęp, więc nie ma potrzeby korzystania z $ _SERVER. –

+1

'$ argv' nie jest dostępny w funkcjach bez słowa kluczowego global. '$ _SERVER' jest superglobalne. – TimWolla

2

Możesz zakodować wartość $_SERVER[HTTP_HOST], jeśli jest pusta, lub możesz wykonać inną kontrolę.

6

Gdy php jest wykonywane w wierszu poleceń, $_SERVER['HTTP_HOST'] jest (oczywiście) niedostępny.

można po prostu pominąć błąd używanie oznaczenia @ lub być nieco bardziej ostrożny przy użyciu wiersza konstrukt:

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

Jak wcześniej wspomniano, $ _SERVER nie jest obecny podczas uruchamiania php poprzez php-cli.

Chociaż istnieje opcja uruchamiania skryptów cron w php-cgi, gdzie będziesz mieć $ _SERVER. Jeśli zwiniesz się na lokalny serwer sieciowy, wówczas $ _SERVER zostanie zapełnione.

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

Jednak, myślę, że trzeba rzeczywiście trzymać się z proponowanymi przez TimWolla lub DerVO, chyba że naprawdę musisz to zachowanie rozwiązań.

Plusy:

  • Dostaniesz wszystkie $ _SERVER zmiennych ustalonych zgodnie z oczekiwaniami.
  • Jeśli potrzebujesz przepisać dużo kodu za pomocą opcji if-else, może to być preferowane, ponieważ nie musisz zmieniać żadnego kodu.

Wady:

  • To niby obejście i prawdopodobnie oznacza nieznaczny wzrost obciążenia procesora.
4

Spróbuj uruchomić zadanie cron z curl .. Zapełni on $ _SERVER ['HTTP_HOST'].

składnia na linux jest jak

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

To było najprostsze rozwiązanie w moim umyśle, o ile twój plik znajduje się pod publicznym adresem URL. AronCederholm również przedstawił podobną sugestię, ale wspiera @waysLearn, aby odpowiedzieć na nią od razu do rzeczy. To działało idealnie dla mnie. – David

Powiązane problemy