Задача Cron Job $_SERVER
Я хочу запустить задание cron. Мое приложение разработано в PHP и Mysql.
В браузере, если я использую $_SERVER[HTTP_HOST]
в кодировании, он отлично работает. Но если я использую то же самое в работе cron, он дает ошибки.
Может ли любое тело дать предложение исправить это?
Ответы
Ответ 1
$_SERVER['HTTP_HOST']
не заполняется при запуске из cronjob, файл не доступен через HTTP.
Вам придется либо скопировать код хоста, либо передать его с помощью аргумента командной строки и получить доступ к нему через массив $_SERVER['argv']
.
Ответ 2
Когда php выполняется в командной строке, $_SERVER['HTTP_HOST']
(конечно) недоступен.
Вы можете просто подавить ошибку с помощью знака @
или немного осторожнее с помощью строки построения:
$host = isset($_SERVER['HTTP_HOST']) ? $_SERVER['HTTP_HOST'] : 'CLI';
Ответ 3
Попробуйте выполнить задание cron с curl.. Он заполнит ваш $_SERVER ['HTTP_HOST'].
Синтаксис в linux похож на
curl http://yourdomain/yourfile.php
Ответ 4
Как было сказано ранее, $_SERVER отсутствует при запуске php через php-cli.
Хотя, есть возможность запускать скрипты cron'd в php-cgi, где у вас будет $_SERVER. Если вы зависаете на локальном веб-сервере, тогда будет заселен $_SERVER.
$ cat /etc/cron.daily/mydailyphpwork
/usr/bin/curl http://domain.tld/path/to/cron-script.php &> /dev/null
Однако, я думаю, вы действительно должны придерживаться решений, предлагаемых TimWolla или DerVO, если вам действительно не нужно это поведение.
Плюсы:
- Вы получите все переменные $_SERVER, как ожидалось.
- Если вам нужно переписать много кода с if-else, это может быть предпочтительным, так как вам не нужно менять какой-либо код.
Минусы:
- Это своего рода обходное решение и, вероятно, означает небольшое увеличение загрузки процессора.
Ответ 5
Вы можете жестко закодировать значение $_SERVER[HTTP_HOST]
, если оно пустое, или вы можете выполнить некоторую другую проверку.
Ответ 6
Добавление жестко закодированных аргументов в crontab не помогло, так как мне нужно, чтобы оно было чувствительным к различным средам
Итак> = PHP 5.3.0 вы можете использовать gethostname()
http://php.net/manual/en/function.gethostname.php
Ответ 7
Я удивлен, что никто не упомянул возможность просто определить любые обязательные значения для массива _SERVER в другом файле, а затем просто включить это. Это самый быстрый способ, который я нашел для запуска php-скрипта на основе cgi из cli для быстрого тестирования/отладки.
Например, файл cron_server_wrapper.php
:
<?php
$_SERVER['SERVER_NAME'] = "localhost";
$_SERVER['HTTP_HOST'] = "localhost";
$_SERVER['REMOVE_ADDR'] = "10.20.30.40";
$_SERVER['DOCUMENT_ROOT'] = "/";
$_SERVER['HTTP_REFERER'] = "/crontab-foo";
Затем запустите:
/usr/bin/php -B "require 'path/to/cron_server_wrapper.php'" -E "require 'my_php_cron_script.php';" < /dev/null