2012-07-13 6 views
1

Ceci est une question sur la configuration de mon système et sur la façon dont apache/php peut être affecté par cela. Le code qui fonctionnait sur mon serveur de développement échouait lorsque je passais en production et voici le problème que j'ai résolu. Je veux utiliser file_put_contents dans php pour simplement créer un fichier sur mon système. Voici le code très simple que j'utilise:file_put_contents php permissions

print file_put_contents("testfile.txt","this is my test")?"made file":"failed"; 

Aucune erreur n'est levée mais elle affiche toujours "Échec". Quand je l'exécute dans le répertoire normal, aucun fichier n'est créé, mais quand je le déplace dans un répertoire avec 777 permission, il crée le fichier mais imprime toujours "échoué" et n'enregistre rien. Si je change le fichier php lui-même pour avoir l'autorisation 777, rien ne change. Si je change le fichier cible (testtext.txt) pour avoir l'autorisation 777, rien ne change.

Lorsque je change le propriétaire du fichier php pour qu'il soit le même que le fichier testfile.txt créé, rien ne change. Quand j'essaie des chemins relatifs ou absolus, rien ne change. Pour une raison quelconque, je peux avoir php faire le fichier mais il est toujours vide et en utilisant file_put_contents je ne peux rien écrire.

Le fichier créé est dans le propriétaire et le groupe de 'www-data' alors que j'agis comme root si cela aide. Que puis-je faire pour que cela fonctionne? Je pense que ma version de php utilise l'extension suhosin si cela peut avoir quelque chose à voir avec ça (ou si vous pensez qu'il y a un moyen de résoudre ce problème dans les fichiers php ou suhosin ini, je peux le faire aussi). Je chasse ça depuis des heures depuis quelques jours.

EDIT: mises à jour basées sur les commentaires ci-dessous. Lorsque je l'exécute en mode CLI cela fonctionne mais comme je dois le faire fonctionner avec Apache, comment puis-je utiliser ce fait? Est-ce que cela nous dit quelque chose sur où ou quoi arrête l'écriture du fichier? De plus, l'appel file_put_contents retourne effectivement "false" et non nul.

+0

a l'utilisateur www-data + w et + x droits sur le dossier qui contiendra ce fichier? pouvez-vous su comme www-data et essayez d'écrire dans ce fichier? – jolivier

+0

file_put_contents() renvoie le nombre d'octets écrits en écriture réussie. Si c'est la création d'un fichier vide, c'est vraisemblablement 0 octets, ce qui donnerait une fausse note. C'est pourquoi vous voyez le message "échoué". Essayez la route 'fopen()'/'fwrite()' à la place. Je ne prévois aucun changement mais bon à vérifier. – Utkanos

+0

Le script fonctionne-t-il lorsque vous l'exécutez CLI? – Tucker

Répondre

1

Vous devez définir des autorisations en tant que 777 pour l'utilisateur apache. Apache doit également être capable de 'créer' de nouveaux fichiers. Je suis sûr que si vous avez essayé d'écrire dans un fichier avec 777 permissions, cela fonctionnerait.

+0

Oui, il semble que CLI fonctionne mais pas Apache, que c'est un problème avec les autorisations. Dans Ubuntu Unix, comment accorder des permissions à un utilisateur - pas un fichier ou un dossier spécifique que j'ai l'habitude de faire avec chmod? – hackartist

+0

Pas sûr. J'utilise linux mint et dans mon natalus il me donne l'option de modifier les permissions pour tous les utilisateurs de machines, avec WWW-Data étant juste là. –

+0

Eh bien, même si je n'ai pas encore réussi à le faire fonctionner, je suis maintenant à environ 95% sûr que c'est un problème d'autorisations avec Apache n'ayant pas les bonnes autorisations pour écrire ces fichiers, donc j'accepte cette réponse. – hackartist

1

La fonction renvoie le nombre d'octets écrits dans le fichier, ou FALSE en cas d'échec.

Assurez-vous que mydir est accessible en écriture (par l'utilisateur apache - apache2 ou www-data). Pour vérifier si le contenu a été écrit dans le fichier utiliser l'opérateur ===:

$file = "mydir/testfile.txt"; 

$result = file_put_contents($file,"this is my test"); 

if ($result === false) 
{ 
    echo "failed to write to $file"; 
} 
else 
{ 
    echo "successfully written $result bytes to $file"; 
} 

Pour le débogage je recommande de définir ce en haut de votre fichier php:

error_reporting(-1); 
ini_set('display_errors', true);