Доступность переменной PHP $_SERVER[] для запланированной задачи Windows

Короткая история: я ищу обходной путь к переменным PHP $_SERVER[], которые недоступны (только) в случае, когда файл сценария PHP запускается из запланированного события планировщика заданий Windows.

У меня есть два сервера Windows 2008 R2 с PHP версии 7.1, работающие на обоих серверах. Я звонил на сервер № 1 "Производство" и сервер № 2 "Разработка". Каждый сервер имеет свою собственную базу данных MySQL.

На страницах, которые я писал, для чтения / записи базы данных MySQL я использовал $_SERVER['SERVER_NAME'], чтобы определить, на каком сервере выполняется сценарий (если страница запущена на сервере разработки, используйте IP-адрес базы данных MySQL на сервере разработки. Если текущий сервер является рабочим сервером, используйте IP рабочей базы данных).

Это прекрасно работает для меня. Исключение составляют случаи, когда я использую планировщик задач Windows для планирования автоматизированной задачи. В этом случае я создаю один отдельный скрипт-файл PHP для отправки электронного письма с некоторой информацией из этой базы данных.

Файл сценария PHP для отправки электронного письма с некоторой информацией из базы данных приводит к:

  • Запуск страницы в браузере приводит к определению $ _SERVER ['SERVER_NAME'] (работает хорошо).
  • Если планировщик задач Windows запускает страницу PHP, это приводит к тому, что $ _SERVER ['SERVER_NAME'] не определяется

Кто-нибудь знает, как я мог бы сделать переменные $ _SERVER [] доступными для.php-файла, запускаемого программой Windows Scheduled Taks (где планировщик задач, конечно, указывает на PHP.exe с рефери на этот скрипт.php-файл)? Или есть другой способ, кроме переменной $ _SERVER [], для определения имени сервера, на котором выполняется скрипт?

2 ответа

Вот мое решение Centos. будет немного отличаться от решения Windows. но в том же духе. в основном я просто помечаю работу cron поддоменом (против имени сервера). Затем я проверяю, выполняется ли это на локальном хосте или из apache, и заменяю переменную сервера на $ cron_host.

Крон:

#crontab -u apache -e
30  3 * * * php /var/www/vhosts/the/script.php -h=staging.domain.com -t=11:30

cron_file.php:

// get hostname from varg
$opts = getopt("h:t:");
$cron_host = $opts['h']; // which host to load from creds file
$time_max  = $opts['t']; // time parameter for database call

creds_file.php:

$localhost = array( '127.0.0.1', '::1' );
$is_localhost = ( !is_array($_SERVER) || !isset($_SERVER['REMOTE_ADDR']) || in_array( $_SERVER['REMOTE_ADDR'], $localhost) ) ? true : false;
$cron_host    = (isset($cron_host)) ? $cron_host : false;
$host_name    = ($is_localhost) ? $cron_host : ((isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : $_SERVER['SERVER_NAME']);

Вы можете использовать переменные среды:

echo $_ENV['COMPUTERNAME'];

Просто убедитесь, что переменные_order правильно установлены в php.ini, чтобы включить E такие как EGPCS,

Или же:

echo getenv('COMPUTERNAME');
Другие вопросы по тегам