Почему PHP-скрипт не может записать файл на сервере 2008 через командную строку или планировщик задач? - PullRequest
2 голосов
/ 11 мая 2010

Я создал вопрос на 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 МБ.

Я использую PHP 5.2.13 через FastCGI в 64-разрядной версии Windows Server Web SP1.

Код извлекает данные инвентаризации с сервера SQL, запускает цикл для создания файла XML для третьей стороны.

Я создал задачу в планировщике задач для запуска c: \ php5 \ php.exe "D: \ inetpub \ tools \ build.php"

Планировщик задач показывает промежуток времени около минуты, то есть, сколько времени требуется скрипту для запуска в браузере.

Ошибка не возвращается, но файл не создан.

Каждый раз, когда я изменяю свойства запланированной задачи, появляется окно с паролем пользователя, и я ввожу пароль учетной записи администратора.

Если я запускаю этот же путь и аргумент в командной строке, это не приводит к ошибке и не создает файл.

Когда я щелкаю правой кнопкой мыши команду запуска командной строки от имени администратора, файл все равно не создается. Я получаю свое эхо-утверждение «файл опубликован», то есть после создания файла, и ошибка не возвращается.

Я делаю простой fopen fwrite fclose, чтобы сохранить содержимое переменной php в файл .xml, и этот файл создается только при запуске сценария через браузер.

Вот что происходит после цикла построения xml:

$feedContent .= "</feed>";</p> <pre><code>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>";

Спасибо

1 Ответ

4 голосов
/ 11 мая 2010

Скорее всего, вам нужно указать абсолютный путь к файлу фида. Непонятно, откуда именно вы выполняете скрипт, но «рабочая директория» скрипта обычно там, откуда он был запущен:

 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).

...