2013-08-20 3 views
6

Сценарий My Phar создает новый файл с fwrite, который отлично работает, он создает новый файл вне phar в том же каталоге, что и файл phar.PHP Phar - file_exists() issue

Но тогда, когда я использую if (file_exists ('file.php')), он не подбирает его.

Но тогда включите и потребуйте забрать его.

Кто-нибудь знает об этой проблеме? Испытывать и исследовать какое-то время, похоже, не может найти решение.

+0

Какая версия PHP? Оболочки URL могут только на verions => PHP 5.0.0 –

+0

Вы пробовали следующую рекомендацию из документации для ['file_exists()'] (http://php.net/file_exists): «Примечание: результаты этой функции кэшируются. Подробнее см. clearstatcache(). "? –

+0

Да, я пробовал clearstatcache() - но кеш сохранил бы его как «существует», и моя проблема в том, что он его не находит - так что это определенно не преступник. – Lan

ответ

4

Работа с путями к файлам и Phar архивы

Работа с путями к файлам и Phar архивы в PHP может быть сложнее. PHP-код внутри файла Phar будет относить относительные пути как относящиеся к архиву Phar, не относительно текущего рабочего каталога. Вот краткий пример:

Допустим, вы имеете следующие файлы:

phar/index.php 
test.php 
my.phar 

Файл index.php находится внутри каталога ФАР. Это файл начальной загрузки для архива ФАР:

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

Файл начальной загрузки выполняется, когда файл Фар включен из PHP скрипта. Наш файл bootstrap просто приведет к объявлению функции «do_it_exist».

Давайте попробуйте запустить другой код внутри test.php и посмотреть, что результаты для каждого прогона:

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

Посмотрите на Run 4. Этот код включает в себя файл ФАР и передает функцию относительного пути. Относительно текущего рабочего каталога index.php не существует. Но по отношению к содержимому phar-архива он существует, поэтому он печатает «true»!

+0

Я знаю, я знаю. это не вопрос. мой phar-пакет создает новый файл OUTSIDE phar-скрипта с использованием fwrite. который отлично работает, создается новый файл. и этот новый может быть позже прочитан включением или требованием, но он не может быть «замечен» файлом_exists - это моя проблема - я думаю, что это может быть ошибка в phar – Lan

+0

@Lan ответил вам на запрос – Vineet1982

+0

спасибо, но если include ('login .php ') или require (' login.php '), как найти и прочитать файл, так как, если (file_exists (' login.php ')) вернет true - конечно, из-за того, что его чтение с помощью include/require показывает путь/местоположение файла правильно, и так, чтобы это не проблема? – Lan

1

Не уверен, что вызывает file_exists() потерпеть неудачу, но вы можете попробовать что-то вроде этого

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

ahh хорошая идея. Благодарю. нужно ли мне впоследствии его закрывать, чтобы сделать его более законным? – Lan

+1

Да, конечно! Вы можете закрыть его после того, как функция fopen будет успешной. Откройте файл, если он закроет файл и вернет true, else вернет false. – Konsole

2

file_exists в PHP есть несколько вопросов, в конкретных случаях.

Вместо этого я рекомендую использовать stat(), что обычно является предпочтительным способом получения этой информации,
не только в php. Также не забудьте очистить кеш, вызвав clearstatcache().

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

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

Примечание: Я стараюсь избегать оператора Подавить @ столько, сколько я могу, но я вижу, это частный случай, как необходимые, чтобы использовать его :)

7

На заглушке в ФАРАХ, вы можете использовать __DIR__ магию константа, чтобы получить папку файла PHAR.

Имея это в виду, вы можете просто использовать

is_file(__DIR__ . DIRECTORY_SEPARATOR . $path); 

Чтобы проверить существование файла в вне ФАР.

Вы можете ТОЛЬКО делать это из заглушки и ТОЛЬКО, если это пользовательский заглушка, а не один, сгенерированный Phar :: setDefaultStub(). Если вам нужно проверить файлы дальше по строке, вам нужно будет как можно скорее получить значение этой константы, например глобальную переменную, пользовательскую немагическую константу или статическое свойство или что-то еще, с чем советуют другие файлы.

EDIT: На самом деле вы также можете использовать dirname(Phar::running(false)), чтобы получить папку PHAR из любой точки PHAR. Эта функция возвращает пустую строку, если вы не находитесь в PHAR, поэтому независимо от того, выполняется ли ваше приложение как PHAR или напрямую, оно должно работать нормально, например.

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

Я могу воспроизвести это поведение, позвонив по телефону Phar::interceptFileFuncs(). Кажется, fopen звонки в режиме записи не перехватываются, а функции, связанные с статусом.

Поскольку абсолютные имена рассматриваются как связанные с файловой системой даже в Phar архивов, которые перехватывают файловые функции:

[...] Абсолютные пути предполагаются попытка загрузить внешние файлы из файловой системы.

... один из способов решения этой проблемы заключается в использовании realpath():

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

я встречаю тот же вопрос сегодня. Через несколько часов выкапываю ... Я нашел ответ.

Вы можете попробовать следующий сценарий?

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

Если файл существует, то проблема

, если вы используете только имя файла без информации о пути, файл PHP лакомство связан с ФАР заглушкой. например:

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

Таким образом, вы должны использовать абсолютный путь, чтобы управлять файлом, например:

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

Надежда эта помощь.

Mark