感谢您提前抽出时间。
我有一个php脚本,应该每天运行一次。我们在客户端的服务器上设置了一个调度任务,它执行一个批处理文件,该文件本质上调用以下内容:
php-cgi.exe -d short_open_tag=On ".'my_script.php"
如果我通过浏览器直接导航到my_script.php,一切都会很好。当我从命令行或通过计划任务执行批处理脚本时,我会收到多个错误。
- 任务调度程序的最后一次运行结果总是"(0xFFFFFFFF)"
- 命令行中的第一个错误是"注意:未定义的索引:DOCUMENT_ROOT"
- 命令行中的第二个错误是"注意:未定义的索引:SCRIPT_NAME"
出现错误的行:
$document_root = $_SERVER[ 'DOCUMENT_ROOT' ];
$_SERVER[ 'FULL_URL' ] .= $_SERVER[ 'SCRIPT_NAME' ];
如果我var_dump()$_SERVER变量,我会看到DOCUMENT_ROOT和SCRIPT_NAME都在那里,并且填充正确。我在SYSTEM用户下以最高权限运行计划任务。
如何从命令行和计划任务中阻止这些错误?
您应该使用php.exe
或php-win.exe
而不是php-cgi.exe
。有关SAP之间差异的详细信息,请参阅本页。
但请注意,$_SERVER
superglobal在CLI中的填充方式与在web服务器中的不同。(我的安装使用php.exe
返回一个空字符串。)
如果要获取当前文件路径,请使用__FILE__
。对于当前目录,请使用__DIR__
。
快速测试供您尝试;这应该返回当前目录:
php -r "echo __DIR__;"
当从存储过程调用批处理文件时,我遇到了错误,但当我直接调用php-cgi.exe并将参数添加到参数文本框时,一切都运行得很好。
我猜我的批处理文件没有适当的权限。