2010-05-11 6 views
2

J'ai créé une question sur serverfault.com, et il a été recommandé de demander ici.Pourquoi le script PHP ne peut-il pas écrire un fichier sur le serveur 2008 via une ligne de commande ou un planificateur de tâches?

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

J'ai un script PHP. Il fonctionne bien quand j'utilise un navigateur. Il écrit un fichier XML dans le même répertoire. Le script prend ~ 60 secondes pour s'exécuter et le fichier XML résultant est ~ 16 Mo. Je cours PHP 5.2.13 via FastCGI sur Windows Server Web édition SP1 64 bits.

Le code extrait l'inventaire du serveur SQL, exécute une boucle pour créer un fichier XML pour un tiers.

J'ai créé une tâche dans le planificateur de tâches à exécuter c: \ php5 \ php.exe "D: \ inetpub \ tools \ build.php"

Le planificateur de tâches montre un laps de temps d'environ une minute, ce qui est combien de temps le script prend pour fonctionner dans un navigateur.

Aucune erreur renvoyée, mais aucun fichier créé.

Chaque fois que je modifie les propriétés d'une tâche planifiée, une boîte de mot de passe utilisateur s'affiche et j'entre le mot de passe du compte administrateur.

Si j'exécute ce même chemin et argument sur une ligne de commande, il ne génère pas d'erreur et ne crée pas le fichier.

Lorsque je clique avec le bouton droit sur l'invite de commande en tant qu'administrateur, le fichier n'est toujours pas créé. Je reçois ma déclaration d'écho "fichier publié" qui est après la création du fichier et aucune erreur n'est renvoyée.

Je fais un fopen fwrite simple fclose pour enregistrer le contenu d'une variable php dans un fichier .xml, et le fichier n'est créé que lorsque le script est exécuté dans le navigateur.

Voici ce qui se passe après la boucle de construction xml:

$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>"; 

Merci

Répondre

4

Très probablement, vous devez spécifier un chemin absolu vers votre fichier d'alimentation. On ne sait pas exactement où vous exécutez le script à partir, mais il est généralement où il a été lancé « le répertoire de travail » du script:

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

va essayer d'écrire le fichier de flux dans:

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

et non pas dans c: \ php5 ou d: \ inetpub \ tools

Je ne sais pas ce que le planificateur de tâches utilise comme répertoire par défaut, mais très probablement ce n'est pas ce que vous attendez.

Vérifiez également que le compte sous lequel vous exécutez le travail dans le planificateur de tâches dispose d'autorisations d'écriture sur le répertoire de sortie. Et vérifiez toujours si un fopen() appelé a réussi (il renvoie FALSE en cas d'échec).

+0

Vous avez raison. Je viens de chercher des aliments.xml et trouvé un dans c: \ users \ administrator J'ai fait l'hypothèse que le script s'exécuterait dans son propre répertoire, peu importe comment j'ai lancé son exécution. Merci pour votre aide – rg89