PHP ne reconnaîtra pas ses propres fichiers temporaires téléchargés

J’ai un vrai scratcher ici.

Ceci est la configuration de mon système:

  • Windows Server 2008 R2
  • PHP 5.3.8 installé en tant que module FastCGI
  • IIS 7.5

C’est mon problème:

J’ai un formulaire de téléchargement de fichier simple. Comme nous le soaps, lorsque PHP accepte un téléchargement de fichier, le fichier reçoit un nom temporaire et est placé dans un répertoire temporaire avant d’être traité. Dans mon cas, PHP place le fichier dans le répertoire temporaire (qui se trouve être E: \ Inetpub_IIS \ tmp, à côté de E: \ Inetpub_IIS \ wwwroot), mais oublie immédiatement que le fichier existe jusqu’à ce que le ramasse-miettes apparaisse, qui supprime le fichier temporaire. Plus précisément, le fichier temporaire est créé dans le répertoire temporaire du serveur, mais lorsque j’appelle sha1_file () sur ce fichier, la fonction ne renvoie rien. file_exists () échoue également. Cela me fait penser que PHP ne peut pas trouver le fichier. Le journal ProcMon ci-dessous montre que PHP cherche au bon endroit.

Voici mon journal ProcMon:

2:43:14.9175650 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Generic Read, Disposition: Create, Options: Synchronous IO Non-Alert, Non-Directory File, Atsortingbutes: N, ShareMode: None, AllocationSize: 0, Impersonating: NT AUTHORITY\IUSR, OpenResult: Created 2:43:14.9182596 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 2:43:14.9184424 PM php-cgi.exe 5020 QueryOpen E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS CreationTime: 12/27/2011 2:43:14 PM, LastAccessTime: 12/27/2011 2:43:14 PM, LastWriteTime: 12/27/2011 2:43:14 PM, ChangeTime: 12/27/2011 2:43:14 PM, AllocationSize: 0, EndOfFile: 0, FileAtsortingbutes: A 2:43:14.9185907 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Write Atsortingbutes, Synchronize, Disposition: Open, Options: Synchronous IO Non-Alert, Open Reparse Point, Atsortingbutes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, Impersonating: NT AUTHORITY\IUSR, OpenResult: Opened 2:43:14.9187896 PM php-cgi.exe 5020 SetBasicInformationFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS CreationTime: 0, LastAccessTime: 0, LastWriteTime: 0, ChangeTime: 0, FileAtsortingbutes: AN 2:43:14.9188368 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 2:43:14.9190234 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Generic Read/Write, Disposition: OverwriteIf, Options: Synchronous IO Non-Alert, Non-Directory File, Atsortingbutes: N, ShareMode: Read, Write, AllocationSize: 0, Impersonating: NT AUTHORITY\IUSR, OpenResult: Overwritten 2:43:14.9193771 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 0, Length: 5,119, Priority: Normal 2:43:14.9489663 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 5,119, Length: 5,119, Priority: Normal 2:43:14.9730524 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 10,238, Length: 5,119 2:43:15.0054693 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 15,357, Length: 5,119, Priority: Normal 2:43:15.0309328 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 20,476, Length: 5,119 2:43:15.0633978 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 25,595, Length: 5,119 2:43:15.0879028 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 30,714, Length: 5,119, Priority: Normal ... 2:43:17.1849721 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 383,925, Length: 5,119 2:43:17.1851664 PM php-cgi.exe 5020 WriteFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Offset: 389,044, Length: 2,343 2:43:17.1852283 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 2:43:17.5070914 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 2:43:17.5083973 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 2:43:17.5112593 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 2:43:17.5120519 PM php-cgi.exe 5020 QueryDirectory E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Filter: php3F86.tmp, 1: php3F86.tmp 2:43:27.5512956 PM php-cgi.exe 5020 CreateFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Desired Access: Read Atsortingbutes, Delete, Disposition: Open, Options: Non-Directory File, Open Reparse Point, Atsortingbutes: n/a, ShareMode: Read, Write, Delete, AllocationSize: n/a, OpenResult: Opened 2:43:27.5515084 PM php-cgi.exe 5020 QueryAtsortingbuteTagFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Atsortingbutes: A, ReparseTag: 0x0 2:43:27.5515406 PM php-cgi.exe 5020 SetDispositionInformationFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS Delete: True 2:43:27.5515879 PM php-cgi.exe 5020 CloseFile E:\Inetpub_IIS\tmp\php3F86.tmp SUCCESS 

Comme vous pouvez le voir, ProcMon montre clairement le fichier temporaire en cours de création, d’écriture puis de fermeture. Vers la fin, vous pouvez voir les appels “QueryDirectory”, qui coïncident avec mes appels de script, qui tentent entre autres d’obtenir le hachage SHA1 du fichier.

Ceci est mon script:

Le formulaire de téléchargement de fichier a un object Flash et quelques DIV pour l’object Flash pour créer le formulaire, rien de plus. Le fichier de téléchargement temporaire est en cours de création sur le serveur dans son intégralité, donc je doute très sérieusement que mon formulaire soit le problème.

 sanitize($_FILES['Filedata']['name']); fwrite($logHandle, "Permanent Filename: " . $sFileName . "\n"); $aFileBits = explode('.', $_FILES['Filedata']['name']); $sFileExt = $aFileBits[count($aFileBits) - 1]; // Get SHA1 hash $sFileHash = sha1_file($sFileTemp); fwrite($logHandle, "Temp File Exists: " . file_exists($sFileTemp) . "\n"); fwrite($logHandle, "Temp File Name: " . $sFileTemp . "\n"); fwrite($logHandle, "File Hash: " . $sFileHash . "\n"); sleep(10); exit(); } ?> 

Le contenu de “logfile.txt”:

 $_FILES error: Permanent Filename: picture.jpg Temp File Exists: Temp File Name: E:\Inetpub_IIS\tmp\php3F86.tmp File Hash: 

L’appel “sleep” existe pour me donner le temps de vérifier le répertoire temporaire du fichier avant qu’il ne disparaisse.

Des dizaines de recherches sur Google m’ont amené à rechercher des permissions ou des solutions impliquant des formulaires de téléchargement endommagés qui ne permettent pas de télécharger quoi que ce soit. Les fichiers sont en cours de création sur le serveur si bien que le formulaire fonctionne. Aussi, j’ai essayé de donner à IUSR, IIS_ISURS et DefaultAppPool un access complet au répertoire temporaire et à tous les E: \ Inetpub_IIS pour voir si cela avait quelque chose à voir avec les permissions associées, mais cela n’a rien changé. Quelqu’un peut-il donner des conseils sur ce qui se passe ici?

EDIT: je l’ai compris.

DaveRandom et moi avons pensé que c’était un problème d’permissions, ce qui était vrai. Cependant, nous pensions tous deux aux permissions Windows, alors que le problème était en réalité un problème de permission / configuration de PHP. La formulation «retour en arrière» de Dave m’a fait penser à reculer dans l’arborescence des répertoires et à tester les permissions qui ont finalement produit la solution suivante.

Ce que j’ai fait:

J’ai écrit un script très court:

  

Cela a renvoyé FAUX. Apparemment, le répertoire n’était pas lisible, comme Dave l’a suggéré.

J’ai essayé le répertoire E: \ Inetpub_IIS \ wwwroot, qui a renvoyé TRUE. Hmm. J’ai alors réalisé que j’avais négligé de vérifier php_error.log toute la journée. Voici ce que j’ai trouvé:

 [27-Dec-2011 16:51:43] PHP Warning: is_readable(): open_basedir ressortingction in effect. File(E:\Inetpub_IIS\tmp) is not within the allowed path(s): (E:\Inetpub_IIS\wwwroot) in E:\Inetpub_IIS\wwwroot\ipl\info.php on line 3 

J’ai googlé “ressortingction open_basedir en vigueur” et j’ai eu ma réponse. Dans le fichier php.ini, open_basedir était défini sur:

 open_basedir = E:\Inetpub_IIS\wwwroot 

J’ai changé ceci pour:

 open_basedir = "E:\Inetpub_IIS\wwwroot;E:\Inetpub_IIS\tmp" 

Après avoir redémarré le serveur, l’application a commencé à fonctionner comme prévu.

J’espère que c’est assez de documentation pour quelqu’un d’autre qui pourrait avoir le même problème.

Morale (s) de l’histoire:

  • Vérifiez votre paramètre open_basedir.
  • Activez, définissez et rappelez-vous de vérifier votre journal des erreurs php.
  • Ne regardez pas le même problème pendant 7 heures sans interruption. Je pense que j’ai presque eu un accident vasculaire cérébral.

Comme promis, voici ma réponse. Cela a été copié / collé à partir de l’édition OP.

Je l’ai compris.

DaveRandom et moi avons pensé que c’était un problème d’permissions, ce qui était vrai. Cependant, nous pensions tous deux aux permissions Windows, alors que le problème était en réalité un problème de permission / configuration de PHP. La formulation «retour en arrière» de Dave m’a fait penser à reculer dans l’arborescence des répertoires et à tester les permissions qui ont finalement produit la solution suivante.

Ce que j’ai fait:

J’ai écrit un script très court:

  

Cela a renvoyé FAUX. Apparemment, le répertoire n’était pas lisible, comme Dave l’a suggéré.

J’ai essayé le répertoire E: \ Inetpub_IIS \ wwwroot, qui a renvoyé TRUE. Hmm. J’ai alors réalisé que j’avais négligé de vérifier php_error.log toute la journée. Voici ce que j’ai trouvé:

 [27-Dec-2011 16:51:43] PHP Warning: is_readable(): open_basedir ressortingction in effect. File(E:\Inetpub_IIS\tmp) is not within the allowed path(s): (E:\Inetpub_IIS\wwwroot) in E:\Inetpub_IIS\wwwroot\ipl\info.php on line 3 

J’ai googlé “ressortingction open_basedir en vigueur” et j’ai eu ma réponse. Dans le fichier php.ini, open_basedir était défini sur:

 open_basedir = E:\Inetpub_IIS\wwwroot 

J’ai changé ceci pour:

 open_basedir = "E:\Inetpub_IIS\wwwroot;E:\Inetpub_IIS\tmp" 

Après avoir redémarré le serveur, l’application a commencé à fonctionner comme prévu.

J’espère que c’est assez de documentation pour quelqu’un d’autre qui pourrait avoir le même problème.

Morale (s) de l’histoire:

  • Vérifiez votre paramètre open_basedir.
  • Activez, définissez et rappelez-vous de vérifier votre journal des erreurs php.
  • Ne regardez pas le même problème pendant 7 heures d’affilée. Je pense que j’ai presque eu un accident vasculaire cérébral.