从计划任务执行php时未定义的$_SCRIPT变量


Undefined $_SCRIPT variables when executing php from a scheduled task

感谢您提前抽出时间。

我有一个php脚本,应该每天运行一次。我们在客户端的服务器上设置了一个调度任务,它执行一个批处理文件,该文件本质上调用以下内容:

php-cgi.exe -d short_open_tag=On ".'my_script.php"

如果我通过浏览器直接导航到my_script.php,一切都会很好。当我从命令行或通过计划任务执行批处理脚本时,我会收到多个错误。

  1. 任务调度程序的最后一次运行结果总是"(0xFFFFFFFF)"
  2. 命令行中的第一个错误是"注意:未定义的索引:DOCUMENT_ROOT"
  3. 命令行中的第二个错误是"注意:未定义的索引:SCRIPT_NAME"

出现错误的行:

$document_root = $_SERVER[ 'DOCUMENT_ROOT' ];
$_SERVER[ 'FULL_URL' ] .= $_SERVER[ 'SCRIPT_NAME' ];

如果我var_dump()$_SERVER变量,我会看到DOCUMENT_ROOT和SCRIPT_NAME都在那里,并且填充正确。我在SYSTEM用户下以最高权限运行计划任务。

如何从命令行和计划任务中阻止这些错误?

您应该使用php.exephp-win.exe而不是php-cgi.exe。有关SAP之间差异的详细信息,请参阅本页。

但请注意,$_SERVER superglobal在CLI中的填充方式与在web服务器中的不同。(我的安装使用php.exe返回一个空字符串。)

如果要获取当前文件路径,请使用__FILE__。对于当前目录,请使用__DIR__

快速测试供您尝试;这应该返回当前目录:

php -r "echo __DIR__;"

当从存储过程调用批处理文件时,我遇到了错误,但当我直接调用php-cgi.exe并将参数添加到参数文本框时,一切都运行得很好。

我猜我的批处理文件没有适当的权限。