Comment faire fonctionner les liens symboliques Windows avec mod_php?

J’essaie d’utiliser des liens symboliques sur Windows 7 depuis PHP. J’exécute XAMPP avec Apache 2.4.10 et PHP 5.5.15 à partir d’un compte utilisateur normal (non-admin). Comme suggéré dans Symlink ne fonctionne pas dans ma machine locale, je configure les permissions correctes pour que mon utilisateur crée des liens symboliques. Cela fonctionne bien, je suis capable de créer des liens symboliques ( mklink ... ) depuis la ligne de commande sans élévation. La fonction PHP symlink() ne génère aucune erreur de permission (code 1314).

Lorsque vous exécutez PHP depuis la ligne de commande ou en le chargeant via CGI, tout fonctionne comme prévu:

  • symlink() est capable de créer des liens symboliques (absolus et relatifs)
    chemins cibles)
  • is_link() renvoie true pour les liens symboliques
  • filetype() renvoie ‘link’ pour les liens symboliques

Cependant, lorsque je lance PHP en tant que module Apache, je rencontre toutes sortes de problèmes:

  • symlink() ne peut créer que des liens symboliques, lorsque la cible est un chemin absolu valide (l’utilisation de chemins relatifs lancera: Warning: symlink(): Could not fetch file information(error 2) )
  • is_link() renvoie false pour les liens symboliques
  • filetype() renvoie ‘fichier’ / ‘répertoire’ pour les liens symboliques

Cela semble être lié à PHP symlink () échoue sur Windows 7 , mais ce bogue a été corrigé dans PHP 5.4 et j’utilise 5.5. En outre, PHP signale le code d’erreur 2, pas 3.

En plus de ma question principale (” Comment faire ce travail? “), Je cherche des réponses aux questions suivantes:

  1. Est-ce un autre bug dans PHP (ou Apache?)?

  2. Quelle est la différence entre le chargement de PHP en tant que module et via CGI et comment cela pourrait-il être lié à cette question?

Et après avoir lu sur la sécurité des threads en PHP :

  1. La sécurité des fils peut-elle avoir quelque chose à voir avec cela?

Je peux dire que mod_php est chargé en tant que version thread-safe (“phpt5 ts .dll”) maintenant.

Voici une partie de httpd.conf pour le chargement en tant que module (parameters xampp par défaut):

 LoadFile "G:/xampp/php/php5ts.dll" LoadFile "G:/xampp/php/libpq.dll" LoadModule php5_module "G:/xampp/php/php5apache2_4.dll"  SetHandler application/x-httpd-php   SetHandler application/x-httpd-php-source  

Et voici les parameters php-cgi:

  SetHandler application/x-httpd-php-cgi   Action application/x-httpd-php-cgi "/php-cgi/php-cgi.exe"  

symlink () ne peut créer que des liens symboliques, lorsque la cible est un chemin absolu valide (l’utilisation de chemins relatifs lancera: Avertissement: symlink (): impossible d’extraire des informations de fichier (erreur 2))

Ceci est dû au bogue suivant en PHP:

is_link () renvoie false pour les liens symboliques

J’ai remarqué la même chose, du moins dans ma configuration actuelle. Lorsque PHP est exécuté en tant que module Apache au lieu de via CGI, la fonction is_link renvoie toujours false pour tout lien symbolique. Ma configuration est la suivante:

  • Windows 7 x64
  • XAMPP 1.8.3
  • PHP 5.5.11

Quelle est la différence entre le chargement de PHP en tant que module et via CGI et comment cela pourrait-il être lié à cette question?

L’avantage de l’exécution de PHP via CGI est que chaque processus PHP peut être exécuté sous un utilisateur différent de celui sous lequel Apache s’exécute. Ceci est utile pour les environnements de serveurs productifs, de sorte que chaque site Web n’a pas besoin d’avoir les mêmes droits d’access. Cependant, exécuter PHP via CGI est également beaucoup plus lent. L’exécuter en tant que module est toujours l’option la plus rapide.

L’exécution de PHP via FastCGI atténue les inconvénients de la performance pour la plupart, mais rest un peu plus lente que son exécution en tant que module.

Quant à savoir pourquoi ces problèmes avec is_link (et type de filetype ) se produisent lors de l’exécution de PHP en tant que module, je ne le sais pas.