9
votes

PHP PHAR - Numéro de fichiers_exists ()

Mon script Phar crée un nouveau fichier avec FCLRITE, qui fonctionne bien, il crée le nouveau fichier en dehors du phar, dans le même répertoire que le fichier PHAR.

Mais alors quand j'utilise si (file_existes ('file.php')), il ne le prend pas.

mais inclure ensuite et nécessite le ramasser.

Quelqu'un peut-il savoir sur ce problème? EST TEST ET RECHERCHE POUR UNE TEMPS A NE PEUX SEMBLER UNE SOLUTION.


4 commentaires

Quelle version de php? Les wrappers d'URL ne peuvent sur seulement la version => PHP 5.0.0


Avez-vous essayé la recommandation suivante à partir de la documentation de File_exists () : "Remarque: Les résultats de cette fonction sont mis en cache. Voir ClearStatCache () pour plus de détails. "?


Oui, j'ai essayé le ClearStatCache () - mais le cache le stockerait comme «existe» et mon problème est que cela ne le trouve pas - donc ce n'est certainement pas le coupable.


Pourrait donner l'exemple de votre structure de répertoire et de votre emplacement des scripts exécutés, qui incluent d'autres scripts et où l'auteur se retrouve-t-il.


6 Réponses :


5
votes

Utilisation des chemins de fichiers et des archives PHAR

Travailler avec des chemins de fichiers et des archives PHAR dans PHP peut être délicate. Le code PHP à l'intérieur d'un fichier PHAR traitera des chemins relatifs comme étant relatifs à l'archive PHAR, pas em> par rapport au répertoire de travail actuel. Voici un court exemple: p>

Dites que vous avez les fichiers suivants: p> xxx pré>

Le fichier index.php est situé à l'intérieur du répertoire PHAR. C'est le fichier bootstrap pour l'archive PHAR: p> xxx pré>

Le fichier bootstrap est exécuté lorsque le fichier PHP est inclus dans un script PHP. Notre fichier bootstrap va simplement causer la fonction "do_it_exist" à être déclarée. P>

Essayons d'exécuter un code différent à l'intérieur de Test.php et voyez ce que les résultats sont pour chaque exécution: P>

//Run 1:
require_once 'phar/index.php';  //PHP file
$file = __DIR__ . "/index.php"; //absolute path
echo does_it_exist($file);      //prints "false"

//Run 2:
require_once 'phar/index.php';  //PHP file
$file = "index.php";            //relative path
echo does_it_exist($file);      //prints "false"

//Run 3:
require_once 'my.phar';         //phar file
$file = __DIR__ . "/index.php"; //absolute path
echo does_it_exist($file);      //prints "false"

//Run 4:
require_once 'my.phar';         //phar file
$file = "index.php";            //relative path
echo does_it_exist($file);      //prints "true"


7 commentaires

je sais je sais. ce n'est pas la question. Mon package PHAR crée un nouveau fichier en dehors du script Phar utilisant Fwrite. Cela fonctionne parfaitement, un nouveau fichier est créé. et ce nouveau peut être lu ultérieurement par inclure ou besoin, mais il ne peut pas être "vu" par file_existes - qui est mon problème - je pense que cela pourrait être un bug de phar


@Lan a répondu que vous avez interrogé


merci, mais si include ("login.php ') ou requis (" login.php') rechercher et lisez le fichier, que sûrement si (fichier_exists ("login.php ')) retournerait vrai - sûrement par le fait que Son lecture par inclure / requise montre que le chemin de fichier / l'emplacement est correct, et ce n'est pas le problème?


@Lan a changé la réponse pour comprendre le travail plus facilement


Hey merci mec, je pense que je commence à voir ce que tu dis. Mais mon problème est que dans mon fichier PHAR, je souhaite vérifier un fichier en dehors de celui-ci. Lorsque j'exécute mon fichier PHAR, il crée "login.php" dans le même répertoire que le phar, mais en dehors de celui-ci. Ensuite, lorsque vous exécutez la pharmacie, j'en ai besoin pour vérifier si ce login.php est là, à l'extérieur. Quel chemin de fichier dois-je utiliser pour cela?


Je ne sais pas ce que vous essayez de faire comme cela dépend du code, mais le truc à faire est fourni


Cette réponse a été levée de MANGSTACULAR.BLOGSPOT .co.uk / 2011/06 / ...



1
votes

Vous ne savez pas ce qui est causant file_exists () pour échouer mais vous pouvez essayer quelque chose comme ça xxx


2 commentaires

ahh bonne idée. Merci. Ai-je besoin de le fonger ensuite pour le garder plus légitime?


Oui bien sûr! Vous pouvez la fermer après si la fonction fopen réussit. Ouvrez le fichier, s'il réussit à fermer le fichier et retourne vrai, sinon retourne faux.



2
votes

file_existes dans PHP a plusieurs problèmes, dans des cas particuliers.

Je vous recommande d'utiliser stat () à la place, ce qui est couramment préféré un moyen d'obtenir cette information,
pas seulement en php. N'oubliez pas non plus d'effacer le cache en appelant ClearStatCache () . xxx

Remarque: j'essaie d'éviter l'opérateur Suppress @ autant que je peux mais je vois ce cas particulier mais je vois ce cas particulier comme nécessitant pour l'utiliser :)


0 commentaires

7
votes

sur le talon de phar, vous pouvez utiliser le __ dir __ code> constante magique pour obtenir le dossier du fichier pharmique.

Dans cet esprit, vous pouvez simplement utiliser P>

$pharFile = Phar::running(false);
is_file(('' === $pharFile ? '' : dirname($pharFile) . DIRECTORY_SEPARATOR) . $path)


1 commentaires

Utilisation de __ dir __ ne fonctionne certainement pas, pas d'un talon personnalisé, pas même un peu. Il retournera le répertoire de travail actuel du fichier PHAR et __ __ retournera le nom du phar.



2
votes

Je peux reproduire ce comportement en appelant phar :: interceptfilefuncs () . Il semble que fopen appels en mode écriture ne sont pas interceptés, tandis que les fonctions liées à STAT sont.

Les noms de fichiers absolus sont traités comme liés au système de fichiers même dans les archives PHAR qui interceptent des fonctions de fichier:

[...] Les chemins absolus sont supposés être des tentatives de chargement de fichiers externes du système de fichiers.

... Une façon de faire face au problème consiste à utiliser realpath () : xxx


0 commentaires

6
votes

Je rencontre le même problème aujourd'hui. Après plusieurs heures de creuser ... j'ai trouvé la réponse.

Pouvez-vous essayer le script suivant d'abord? xxx

si le fichier existe, alors le problème est

Si vous n'utilisez que le nom de fichier sans informations de chemin, le fichier Treat PHP est lié au Stub Phar. Par exemple:

PHAR: //a/b/c/file.php

Donc, vous devez utiliser un chemin absolu pour manipuler le fichier , par exemple:

/home/www/d/e/f/file.php

espère cette aide.

Mark


0 commentaires