2013-08-20 7 views
6

Mein Phar-Skript erstellt eine neue Datei mit fwrite, die gut funktioniert, erstellt die neue Datei außerhalb der Phar, im selben Verzeichnis wie die Phar-Datei.PHP Phar - file_exists() Problem

Aber wenn ich if (file_exists ('file.php')) benutze es nicht abholen.

Aber dann einbeziehen und erfordern, holen Sie es auf.

Wer kennt dieses Problem? Testen und forschen für eine Weile, kann nicht scheinen, eine Lösung zu finden.

+0

Welche Version von PHP? URL Wrapper können nur auf verions => PHP 5.0.0 –

+0

Haben Sie die folgende Empfehlung aus der Dokumentation für ['file_exists()'] (http://php.net/file_exists) versucht: "Hinweis: Die Ergebnisse dieser Funktion werden im Cache gespeichert. Weitere Informationen finden Sie unter clearstatcache(). "? –

+0

ja, ich habe versucht den clearstatcache() - aber der Cache würde es als "existiert" speichern und mein Problem ist, dass es nicht finden - also das ist definitiv nicht der Schuldige. – Lan

Antwort

4

Arbeiten mit Dateipfaden und Phar Archiven

Arbeiten mit Dateipfaden und Phar Archiven in PHP kann schwierig sein. Der PHP-Code innerhalb einer Phar-Datei behandelt relative Pfade relativ zum Phar-Archiv, nicht relativ zum aktuellen Arbeitsverzeichnis. Hier ist ein kurzes Beispiel:

Angenommen, Sie haben die folgenden Dateien:

phar/index.php 
test.php 
my.phar 

Die index.php Datei befindet sich im Inneren des Phar-Verzeichnis. Es ist die Bootstrap-Datei für das Phar-Archiv:

function does_it_exist($file){ 
    return file_exists($file) ? "true" : "false"; 
} 

Die Bootstrap-Datei ausgeführt wird, wenn die Phar-Datei von einem PHP-Skript enthalten ist. Unsere Bootstrap-Datei wird einfach dazu führen, dass die Funktion "does_it_exist" deklariert wird.

Lasst uns versuchen, innerhalb von test.php anderen Code ausgeführt wird und sehen, was die Ergebnisse für jeden Durchlauf sind:

//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" 

Blick auf Run 4. Dieser Code enthält die Phar-Datei und übergibt die Funktion einen relativen Pfad. Relativ zum aktuellen Arbeitsverzeichnis existiert index.php nicht. Aber im Vergleich zum Inhalt des Phar-Archivs existiert es, weshalb es "wahr" druckt!

+0

ich weiß, ich weiß. Das ist nicht die Frage. Mein phar-Paket erstellt eine neue Datei OUTSIDE des phar-Skripts mit fwrite. das funktioniert einwandfrei, es wird eine neue Datei erstellt. und diese neue kann später von include oder erfordern gelesen werden, aber es kann nicht von file_exists "gesehen" werden - das ist mein Problem - ich denke, es könnte ein Fehler sein in Phar – Lan

+0

@Lan antwortete Sie Abfrage – Vineet1982

+0

danke, aber wenn include ('Login .php ') oder erfordern (' login.php ') sowohl finden und lesen die Datei, als sicher, wenn (file_exists (' login.php ')) würde True zurück - sicherlich durch die Tatsache, dass seine gelesen von include/require zeigt den Dateipfad/Speicherort ist richtig, und so ist nicht das Problem? – Lan

1

nicht sicher, was file_exists() verursacht zu scheitern, aber Sie können so etwas wie dieses

function fileExists($path){ 
    //try to open the file, if it can be read the file exist 
    return (@fopen($path,"r") == true); 
} 
+1

Ahh gute Idee. Vielen Dank. Muss ich es hinterher schließen, um es legitimer zu halten? – Lan

+1

Ja natürlich! Sie können es später schließen, wenn die Funktion fopen erfolgreich ist. Öffnen Sie die Datei, wenn es erfolgreich ist, schließen Sie die Datei und geben Sie "true" zurück, sonst geben Sie false zurück. – Konsole

2

file_exists in PHP versuchen, hat einige Probleme, in besonderen Fällen.

Ich empfehle Ihnen stattdessen stat() verwenden, die häufig bevorzugte Weg, um diese Informationen zu erhalten,
nicht nur in PHP. Vergessen Sie auch nicht, den Cache zu leeren, indem Sie clearstatcache() anrufen.

function FileExists($filename) 
{ 
    clearstatcache(false, $filename); 

    return false !== @stat($filename); 
} 

Hinweis: Ich versuche, den Unterdrückungs-Betreiber zu vermeiden @ so viel wie ich kann, aber ich sehe diesen speziellen Fall als notwendig, es zu benutzen :)

7

Auf dem Stummel PHAR, können Sie die __DIR__ Magie Konstante, um den Ordner der PHAR-Datei zu erhalten.

, die mit im Auge, können Sie einfach

is_file(__DIR__ . DIRECTORY_SEPARATOR . $path); 

verwenden außerhalb der PHAR für eine Datei Existenz zu überprüfen.

Sie können dies NUR aus dem Stub tun, und NUR, wenn es sich um einen benutzerdefinierten Stub handelt, im Gegensatz zu einem, der von Phar :: setDefaultStub() generiert wurde. Wenn Sie weiter unten nach Dateien suchen müssen, müssen Sie den Wert dieser Konstante irgendwie verfügbar machen, wie eine globale Variable, eine benutzerdefinierte nicht-magische Konstante oder eine statische Eigenschaft oder etwas, mit der sich andere Dateien dann beraten.

EDIT: Eigentlich können Sie auch dirname(Phar::running(false)) verwenden, um den PHAR-Ordner von irgendwo im PHAR zu bekommen. Diese Funktion gibt eine leere Zeichenfolge zurück, wenn Sie sich nicht in einem PHAR befinden. Ob Ihre Anwendung als PHAR oder direkt ausgeführt wird, sollte also gut funktionieren, z.

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

kann ich dieses Verhalten reproduzieren, indem Phar::interceptFileFuncs() aufrufen. Es scheint, fopen Anrufe im Schreibmodus werden nicht abgefangen, während stat-Funktionen sind.

Da absolute Dateinamen wie im Zusammenhang mit dem Dateisystem behandelt werden, sogar in Phar-Archiven, die Intercept-Datei Funktionen:

[...] Absolute Pfade sind davon ausgegangen, versucht zu laden externe Dateien aus dem Dateisystem sein.

... ein Weg, mit dem Problem umzugehen ist, realpath() zu verwenden:

if (file_exists(realpath($filename)) { /* file exists on filesystem */ } 
4

ich das gleiche Problem heute erfüllen. Nach einigen Stunden graben ... fand ich die Antwort.

Können Sie das folgende Skript zuerst versuchen?

if(file_exists(realpath('file.php'))); 

Wenn die Datei vorhanden ist, dann ist die Frage

, wenn Sie nur den Dateinamen ohne Pfadinformationen verwenden, php treat-Datei phar Stummel verwandt ist. zum Beispiel:

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

Also, Sie haben absoluten Pfad zu verwenden, um die Datei, zum Beispiel zu manipulieren:

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

Hope this Hilfe.

Mark