为什么 PHP 脚本不能通过命令行或任务调度程序在 server 2008 上写入文件?

rg8*_*g89 2 php fastcgi scheduled-tasks fwrite

我在 serverfault.com 上创建了一个问题,建议我在这里提问。

https://serverfault.com/questions/140669/why-cant-php-script-write-a-file-on-server-2008-via-command-line-or-task-schedul

我有一个 PHP 脚本。当我使用浏览器时,它运行良好。它在同一目录中写入一个 XML 文件。该脚本需要大约 60 秒才能运行,生成的 XML 文件大约为 16 MB。

我在 Windows Server Web edition SP1 64 位上通过 FastCGI 运行 PHP 5.2.13。

该代码从 SQL 服务器中提取库存,运行一个循环来为第三方构建一个 XML 文件。

我在任务调度程序中创建了一个任务来运行 c:\php5\php.exe "D:\inetpub\tools\build.php"

任务调度程序显示大约一分钟的时间流逝,这是脚本在浏览器中运行所需的时间。

没有返回错误,但没有创建文件。

每次更改计划任务属性时,都会出现一个用户密码框,然后我输入管理员帐户密码。

如果我在命令行运行相同的路径和参数,它不会出错,也不会创建文件。

当我以管理员身份右键单击运行命令提示符时,仍未创建该文件。我在文件创建之后得到了我的 echo 语句“文件已发布”,并且没有返回错误。

我正在做一个简单的 fopen fwrite fclose 来将 php 变量的内容保存到 .xml 文件中,并且只有在通过浏览器运行脚本时才会创建该文件。

下面是 xml-building 循环之后发生的事情:

$feedContent .= "</feed>";

sqlsrv_close( $conn );

echo "<p>feed built</p>";

$feedFile = "feed.xml";

$handler = fopen($feedFile, 'w');

fwrite( $handler, $feedContent );

fclose( $handler );

echo "<p>file published</p>";
Run Code Online (Sandbox Code Playgroud)

谢谢

Mar*_*c B 5

您很可能需要指定提要文件的绝对路径。不清楚您从哪里执行脚本,但脚本的“工作目录”通常是它的启动位置:

 c:\some\deeply\nested\directory> c:\php5\php.exe d:\inetpub\tools\build.php
Run Code Online (Sandbox Code Playgroud)

将尝试将提要文件写入:

 c:\some\deeply\nested\directory\feed.xml
Run Code Online (Sandbox Code Playgroud)

而不是在 c:\php5 或 d:\inetpub\tools

我不知道任务调度程序使用什么作为其默认目录,但很可能它不是您所期望的。

还要检查您在任务调度程序中运行作业的帐户是否对输出目录具有写入权限。并始终检查fopen()调用是否成功(失败时返回 FALSE)。