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ファイルは最大16MBになります。

WindowsServerWebエディションSP164ビットでFastCGIを介してPHP5.2.13を実行しています。

このコードは、SQLサーバーからインベントリを取得し、ループを実行してサードパーティのXMLファイルを作成します。

タスクスケジューラでc:\ php5 \ php.exe "D:\ inetpub \ tools\build.php"を実行するタスクを作成しました

タスクスケジューラは、約1分の時間経過を示します。これは、スクリプトがブラウザで実行されるのにかかる時間です。

エラーは返されませんが、ファイルは作成されません。

スケジュールされたタスクのプロパティを変更するたびに、ユーザーパスワードボックスが表示され、管理者アカウントのパスワードを入力します。

これと同じパスと引数をコマンドラインで実行しても、エラーは発生せず、ファイルも作成されません。

管理者として実行コマンドプロンプトを右クリックしても、ファイルは作成されません。ファイル作成後のエコーステートメント「filepublished」が表示され、エラーは返されません。

単純なfopenfwritefcloseを実行して、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 に答える