Почему is_readable & is_writable & file_exists завершится ошибкой для пути URL, а не для файла в том же каталоге? - PullRequest
2 голосов
/ 15 июня 2011

Я гуглил этот вопрос два дня и действительно не нашел никого, кто мог бы дать мне твердый ответ.Может быть, гении в stackoverflow могут помочь?

Моя загадка: я пытаюсь читать и писать в файл, используя синтаксис URL для URL, указывающего на файл на моем сервере.(См. Код ниже). Код работает нормально, если имя файла находится в том же каталоге, что и файл php, и я не использую в нем URL-сокет.(т. е. $ filename = "test.xml") Но как только я пытаюсь добавить сокет URL (т. е. http://127.0.0.1/site_folder/text.xml), я получаю сбои во всех трех тестах (is_readable, is_writable, file_exists). Почему это будет?Есть ли способ исправить это так, чтобы я мог читать и записывать этот файл?

Мои настройки: PHP 5.3.2 в Microsoft IIS 7.0.6000.16386 на компьютере с операционной системой Microsoft Vista, каталог PHP: c: \ Program Files (x86) \ php \ Security: я установил разрешения для каталога файла и самого файла для учетной записи IUSR на чтение, запись, выполнение, список каталогов. Этот файл php находится в том же каталоге, что и файл test.xml длясейчас. Но я хочу, чтобы этот URL работал так, чтобы в будущем я мог настроить файл в другом каталоге.

php.ini config: я пробовал эти параметры среди других:

open_basedir=Off; 
fastcgi.impersonate = 1;
display_errors = On;
error_reporting = E_ALL & ~E_STRICT;
safe_mode = Off;
allow_url_fopen = Off; (and tried On, neither works);
allow_url_include = Off; (and tried On, neither works);

Вот мой простой пример кода:

<?php
        $filename = "http://127.0.0.1/sitename/admin/interface/test.xml"; // this one fails
//      $filename = "text.xml" // this one works fine
    echo $filename;

        if (is_readable($filename)) {
                echo "<br />The file is readable...<br />";
        } else {
                echo "<br />The file is not readable...<br />";
        }

        if (is_writable($filename)) {
                echo "The file is writable...<br />";
        } else {
                echo "The file is not writable...<br />";
        }

        if (file_exists($filename)) { 
                echo "File exists...<br />";
        } else {
                echo "File cannot be found...<br />";
        }
?>

И вывод, который я получаю:

http://127.0.0.1/sitename/admin/interface/test.xml
The file is not readable...
The file is not writable...
File cannot be found...

Есть идеи, почему это происходит?то же самое происходит с PHP 5.3.2 на моем MacBook Pro WiСервер Apache на нем.

Ответы [ 3 ]

5 голосов
/ 15 июня 2011

Оболочка протокола http: // не поддерживает семейство функций stat () (см. http://php.net/manual/wrappers.http.php, чтобы узнать, что поддерживается). Поддержка stat () необходима для file_exists, is_writable и is_readable.

Оболочка протокола file: // (по умолчанию используется в вашем рабочем примере) поддерживает stat (): http://php.net/manual/wrappers.file.php

Подробнее о протоколах и обёртках вы можете прочитать здесь: http://php.net/manual/wrappers.php

1 голос
/ 16 августа 2013
$filename = "//127.0.0.1/sitename/admin/interface/test.xml";

вы можете попытаться изменить этот путь, например ../../test.xml или в том же каталоге, используя test.xml я пытался и та же проблема решена

0 голосов
/ 15 июня 2011

Если вы хотите выполнить File I / O, тогда передайте фактические пути (для их указания может быть полезно использовать $_SERVER['DOCUMENT_ROOT']).PHP fopen поддерживает специальную обработку URL-адресов, но оболочки для других функций ввода-вывода файлов - нет.

...