Подтвердить что ты не робот

Задача Cron Job $_SERVER

Я хочу запустить задание cron. Мое приложение разработано в PHP и Mysql.

В браузере, если я использую $_SERVER[HTTP_HOST] в кодировании, он отлично работает. Но если я использую то же самое в работе cron, он дает ошибки.

Может ли любое тело дать предложение исправить это?

4b9b3361

Ответ 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