2

我在 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 版 SP1 64 位上通过 FastCGI 运行 PHP 5.2.13。

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

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

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

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

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

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

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

我正在做一个简单的 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>";

谢谢

4

1 回答 1

6

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

 c:\some\deeply\nested\directory> c:\php5\php.exe d:\inetpub\tools\build.php

将尝试将提要文件写入:

 c:\some\deeply\nested\directory\feed.xml

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

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

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

于 2010-05-11T17:19:58.593 回答