【问题标题】:PHP $_SERVER[] variable avilability to a Windows Scheduled TaskPHP $_SERVER[] 变量对 Windows 计划任务的可用性
【发布时间】:2018-06-10 19:10:25
【问题描述】:

短故事:我正在寻找解决 PHP $_SERVER[] 变量不可用(仅)在从 Windows 任务计划程序计划事件运行 PHP 脚本文件的情况下的解决方法。

我有两台 Windows 2008 R2 服务器,两台服务器上都运行 PHP 版本 7.1。我一直将服务器#1 称为“生产”,将服务器#2 称为“开发”。每台服务器都有自己的 MySQL 数据库。

在我一直在写的页面上,对于 MySQL db 读/写,我一直在使用 $_SERVER['SERVER_NAME'] 来识别正在运行脚本的服务器(如果页面在开发服务器上运行,使用开发服务器上MySQL db的IP地址。如果当前服务器是生产服务器,使用生产数据库IP)。

这对我来说非常好。例外情况是当我使用 Windows 任务计划程序来计划自动化任务时。在这种情况下,我正在创建一个独立的 PHP 脚本文件来发送一封电子邮件,其中包含来自该数据库的一些信息。

用于发送包含数据库中一些信息的电子邮件的 PHP 脚本文件导致:

  • 在浏览器中运行页面会导致 $_SERVER['SERVER_NAME'] 被定义(效果很好)。
  • 如果 Windows 任务调度程序运行 PHP 页面这会导致 $_SERVER['SERVER_NAME'] 未被定义

有谁知道我如何使 $_SERVER[] 变量可用于由 Windows Scheduled Taks 运行的 .php 文件(其中任务调度程序当然指向 PHP.exe 并带有该脚本的裁判。 php 文件)?或者,除了 $_SERVER[] 变量之外,还有其他方法来检测正在运行脚本的服务器的名称吗?

【问题讨论】:

  • 这与任务调度器关系不大。在 CLI 中运行的脚本也永远不会有任何可用的 HTTP 服务器环境变量。使用包装脚本或其他东西。
  • 这就是我所做的:我的计划任务是小型 php 脚本,它们使用 curl 向服务器发出 http 请求,用于为每个任务设计的特定 api servlet。
  • 不错。谢谢。
  • 你放弃了吗?

标签: php windows-server-2008


【解决方案1】:

这是我的 centos 解决方案。将与 windows 解决方案略有不同。但本着同样的精神。基本上我只是用子域(与服务器名称)标记 cron 作业。然后我检查它是在 localhost 上运行还是从 apache 运行,并根据需要用 $cron_host 替换服务器变量。

Cron:

#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']);

【讨论】:

    【解决方案2】:

    你可以使用环境变量:

    echo $_ENV['COMPUTERNAME'];
    

    只需确保在 php.ini 中正确设置 variables_order 以包含 E,例如 EGPCS

    或者:

    echo getenv('COMPUTERNAME');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 2011-06-20
      • 2010-09-22
      • 2012-06-05
      • 2017-04-19
      相关资源
      最近更新 更多