Не удалось открыть поток нет такого файла или каталога

Обновлено: 05.07.2024

В сценариях PHP при вызове include() , require() , fopen() или их производных, таких как include_once , require_once или даже move_uploaded_file() , часто встречается ошибка или предупреждение:

Не удалось открыть поток: нет такого файла или каталога.

Что такое хороший процесс, чтобы быстро найти причину проблемы?

Есть много причин, по которым можно столкнуться с этой ошибкой, и, таким образом, хороший контрольный список того, что проверять в первую очередь, значительно помогает.

Давайте рассмотрим, что мы устраняем неисправности в следующей строке:

Контрольный список

1. Проверьте путь к файлу для опечаток

или переместите все, что вызвано require* или include* , в свою собственную переменную, отобразите его, скопируйте и попробуйте получить доступ к нему из терминала:

Затем в терминале:

2. Проверьте правильность пути к файлу относительно относительного и абсолютного пути.

  • если он начинается с косой черты "/", то это относится не к корню папки вашего сайта (корню документа), а к корню вашего сервера.
    • например, каталог вашего сайта может быть /users/tony/htdocs
    • таким образом, не относительно пути корня вашего веб-сайта или файла, в который вы вводите
    • по этой причине всегда используйте абсолютные пути к файлам

    Чтобы сделать ваш сценарий устойчивым в случае, если вы перемещаете вещи, все еще генерируя абсолютный путь во время выполнения, у вас есть 2 варианта:

      используйте require __DIR__ . "/relative/path/from/current/file" . __DIR__ magic constant возвращает каталог текущего файла.

    определите константу SITE_ROOT самостоятельно:

      в корне каталога вашего веб-сайта создайте файл, например, config.php

    в config.php , напишите

    в каждом файле, где вы хотите сослаться на корневую папку сайта, включите config.php , а затем используйте константу SITE_ROOT , где хотите:

    Эти 2 метода также делают ваше приложение более переносимым, поскольку оно не зависит от настроек ini, таких как путь включения.

    3. Проверьте ваш путь включения

    Другой способ включения файлов, ни относительно, ни сугубо абсолютный, заключается в использовании include path . Это часто имеет место для библиотек или фреймворков, таких как фреймворк Zend.

    Такое включение будет выглядеть так:

    В этом случае вам нужно убедиться, что папка, в которой находится "Zend", является частью пути включения.

    Вы можете проверить путь включения с помощью:

    Вы можете добавить в него папку с помощью:

    4. Убедитесь, что ваш сервер имеет доступ к этому файлу

    Может случиться так, что все вместе, пользователь, выполняющий процесс сервера (Apache или PHP), просто не имеет разрешения на чтение или запись в этот файл.

    Чтобы проверить, под каким пользователем работает сервер, вы можете использовать posix_getpwuid :

    Чтобы узнать разрешения для файла, введите в терминале следующую команду:

    5. Проверьте PHP настройки

    Если ничего из вышеперечисленного не сработало, возможно, проблема в том, что некоторые настройки PHP запрещают ему доступ к этому файлу.

    Три настройки могут быть актуальны:

      • Если это установлено, PHP не сможет получить доступ ни к какому файлу за пределами указанного каталога (даже через символическую ссылку).
      • Тем не менее, поведение по умолчанию для него не должно быть установлено, в этом случае нет никаких ограничений
      • Это можно проверить, вызвав phpinfo() или используя ini_get("open_basedir")
      • Вы можете изменить настройку, отредактировав файл php.ini или файл httpd.conf.
      • если это включено, ограничения могут применяться. Однако это было удалено в PHP 5.4. Если вы все еще используете версию, которая поддерживает обновление в безопасном режиме, до версии PHP, которая все еще поддерживается .
      • это относится только к включению или открытию файлов через сетевой процесс, такой как http: // не при попытке включить файлы в локальную файловую систему
      • это можно проверить с помощью ini_get("allow_url_include") и установить с помощью ini_set("allow_url_include", "1")

    Угловые чехлы

    Если ничего из перечисленного не позволяет диагностировать проблему, вот несколько особых ситуаций, которые могут произойти:

    1. Включение библиотеки с использованием пути включения

    Может случиться так, что вы включите библиотеку, например, Zend Framework, используя относительный или абсолютный путь. Например :

    Но тогда вы все равно получаете такую ​​же ошибку.

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

    Например, упомянутый ранее файл Zend Framework может содержать следующее:

    который не является ни включением ни по относительному пути, ни по абсолютному пути. Предполагается, что каталог Zend Framework был добавлен в путь включения.

    В таком случае единственное практическое решение - добавить каталог к ​​вашему пути включения.

    2. SELinux

    Если вы используете Security-Enhanced Linux, то это может быть причиной проблемы, так как вы отказываете в доступе к файлу с сервера.

    Чтобы проверить, включен ли в вашей системе SELinux , выполните команду sestatus в терминале. Если команда не существует, значит, SELinux отсутствует в вашей системе. Если он существует, то он должен сказать вам, применяется ли он или нет.

    Чтобы проверить, являются ли политики SELinux причиной проблемы, вы можете временно отключить ее. Однако будьте осторожны, так как это полностью отключит защиту. Не делайте этого на вашем производственном сервере.

    Если у вас больше нет проблемы с выключенным SELinux, то это является основной причиной.

    Чтобы решить эту проблему , вам необходимо соответствующим образом настроить SELinux.

    Будут необходимы следующие типы контекста:

    В любом случае может быть множество причин, по которым SELinux может запретить доступ к файлу, в зависимости от ваших политик. Так что вам нужно будет выяснить это. Здесь учебник, посвященный настройке SELinux для веб-сервера.

    3. Symfony

    Если вы используете Symfony и сталкиваетесь с этой ошибкой при загрузке на сервер, возможно, кэш приложения не был сброшен, либо потому, что был загружен app/cache , либо этот кэш не был очищен.

    4. Не ACSII символы внутри Zip-файла

    По-видимому, эта ошибка также может возникать при вызове Zip->close() , когда в некоторых файлах внутри Zip есть не-ASCII-символы в имени файла, например, "é".

    Потенциальное решение - заключить имя файла в utf8_decode() перед созданием целевого файла.

    Кредиты Fran Cano для выявления и предложения решения этой проблемы

    Чтобы добавить (действительно хороший) существующий ответ

    Программное обеспечение Shared Hosting

    Попросите администратора сервера проконсультироваться с руководством по использованию программного обеспечения хостинга и веб-сервера, которое они используют.

    Файловые права

    Часто люди решают проблему с разрешениями, выполняя следующее (пример Linux)

    Это не разумная идея, потому что файл или каталог теперь доступны для записи. Если вы являетесь владельцем сервера и являетесь единственным пользователем, то это не так уж и сложно, но если вы работаете в среде общего хостинга, вы только что предоставили всем доступ к своему серверу.

    Что вам нужно сделать, это определить пользователей, которым нужен доступ, и предоставить доступ только тем, кому они. Как только вы знаете, каким пользователям нужен доступ, вам нужно убедиться, что

    Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корнем. Пример Linux показан ниже

    Пользователь и только этот пользователь имеет доступ. В Linux рекомендуется использовать chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но каждый может читать)

    В PHP скриптах, будь то вызов include() , require() , fopen() или их производные, такие как include_once , require_once , или даже, move_uploaded_file() часто встречается ошибка или предупреждение:

    Не удалось открыть поток: нет такого файла или каталога.

    Что такое хороший процесс, чтобы быстро найти причину проблемы?

    Решение

    Есть много причин, по которым можно столкнуться с этой ошибкой, и, таким образом, хороший контрольный список того, что проверять первым, значительно помогает.

    Давайте рассмотрим, что мы устраняем неисправности в следующей строке:

    1. Проверьте путь к файлу для опечаток

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

    Затем в терминале:

    2. Проверьте правильность пути к файлу относительно относительного и абсолютного пути.

    • если он начинается с косой черты «/», то это относится не к корню папки вашего сайта (корню документа), а к корню вашего сервера.
      • например, каталог вашего сайта может быть /users/tony/htdocs
      • таким образом, не относительно пути корня вашего веб-сайта или файла, в котором вы печатаете
      • по этой причине всегда используйте абсолютные пути к файлам

      Чтобы сделать ваш сценарий надежным на случай, если вы что-то передвигаете, и при этом генерируете абсолютный путь во время выполнения, у вас есть 2 варианта:

        использование require __DIR__ . "/relative/path/from/current/file" , __DIR__ магическая константа возвращает каталог текущего файла.

      определить SITE_ROOT константа себя:

        в корне каталога вашего веб-сайта создайте файл, например, config.php

      в config.php , записывать

      в каждом файле, где вы хотите сослаться на корневую папку сайта, включите config.php , а затем используйте SITE_ROOT постоянная где угодно

      Эти 2 метода также делают ваше приложение более переносимым, поскольку оно не зависит от настроек ini, таких как путь включения.

      3. Проверьте ваш путь включения

      Такое включение будет выглядеть так:

      В этом случае вам нужно убедиться, что папка, в которой находится «Zend», является частью пути включения.

      Вы можете проверить путь включения с помощью:

      Вы можете добавить в него папку с помощью:

      4. Убедитесь, что ваш сервер имеет доступ к этому файлу

      Может случиться так, что все вместе, пользователь, выполняющий процесс сервера (Apache или PHP), просто не имеет разрешения на чтение или запись в этот файл.

      Чтобы проверить, под каким пользователем работает сервер, вы можете использовать posix_getpwuid :

      Чтобы узнать разрешения для файла, введите в терминале следующую команду:

      5. Проверьте настройки PHP

      Если ничего из вышеперечисленного не сработало, возможно, проблема в том, что некоторые настройки PHP запрещают ему доступ к этому файлу.

      Три настройки могут быть актуальны:

        • Если это установлено, PHP не сможет получить доступ ни к какому файлу за пределами указанного каталога (даже через символическую ссылку).
        • Тем не менее, поведение по умолчанию для него не должно быть установлено, в этом случае нет никаких ограничений
        • Это можно проверить, позвонив phpinfo() или с помощью ini_get("open_basedir")
        • Вы можете изменить настройку, отредактировав файл php.ini или файл httpd.conf.
        • если это включено, ограничения могут применяться. Однако это было удалено в PHP 5.4. Если вы все еще используете версию, которая поддерживает обновление в безопасном режиме, до версии PHP, которая все еще поддерживается .
        • это относится только к включению или открытию файлов через сетевой процесс, такой как http: // не при попытке включить файлы в локальную файловую систему
        • это можно проверить с помощью ini_get("allow_url_include") и установить с ini_set("allow_url_include", "1")

      Если ничего из перечисленного не позволяет диагностировать проблему, вот несколько особых ситуаций, которые могут произойти:

      1. Включение библиотеки с использованием пути включения

      Может случиться так, что вы включите библиотеку, например Zend Framework, используя относительный или абсолютный путь. Например :

      Но тогда вы все равно получаете такую ​​же ошибку.

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

      Например, упомянутый ранее файл Zend Framework может содержать следующее:

      который не является ни включением ни по относительному пути, ни по абсолютному пути. Предполагается, что каталог Zend Framework был добавлен в путь включения.

      2. SELinux

      Если вы работаете в Security-Enhanced Linux, это может быть причиной проблемы, так как вы отказываете в доступе к файлу с сервера.

      Чтобы проверить, включен ли SELinux в вашей системе запустите sestatus команда в терминале. Если команда не существует, значит, SELinux отсутствует в вашей системе. Если он существует, то он должен сказать вам, применяется ли он или нет.

      Чтобы проверить, являются ли политики SELinux причиной для проблемы, вы можете попробовать отключить его временно. Однако будьте осторожны, так как это полностью отключит защиту. Не делайте этого на вашем производственном сервере.

      Если у вас больше нет проблемы с выключенным SELinux, то это является основной причиной.

      Чтобы решить это, вам нужно будет настроить SELinux соответственно.

      Следующие типы контекста будут необходимы:

      В любом случае может быть множество причин, по которым SELinux будет отказывать в доступе к файлу, в зависимости от ваших политик. Так что вам нужно будет узнать об этом. Вот руководство по настройке SELinux для веб-сервера.

      3. Symfony

      Если вы используете Symfony и сталкиваетесь с этой ошибкой при загрузке на сервер, возможно, кэш приложения не был сброшен, либо потому, что app/cache был загружен, или этот кэш не был очищен.

      4. Не ACSII символы внутри Zip-файла

      По-видимому, эта ошибка может произойти и при вызове zip->close() когда в некоторых файлах внутри zip есть не-ASCII символы в имени файла, такие как «é».

      Кредиты для Фран кано для выявления и предложения решения этой проблемы

      Другие решения

      Чтобы добавить (действительно хороший) существующий ответ

      Попросите администратора вашего сервера проконсультироваться с руководством по использованию программного обеспечения хостинга и веб-сервера, которое они используют.

      Часто люди решают проблему с разрешениями, выполняя следующее (пример Linux)

      Это не разумная идея, потому что файл или каталог теперь доступны для записи. Если вы являетесь владельцем сервера и являетесь единственным пользователем, то это не так уж важно, но если вы работаете в среде общего хостинга, вы только что предоставили всем доступ к своему серверу.

      Что вам нужно сделать, это определить пользователей, которым требуется доступ, и предоставить доступ только тем, кому они. Как только вы знаете, каким пользователям нужен доступ, вам нужно убедиться, что

      Этот пользователь владеет файлом и, возможно, родительский каталог (особенно родительский каталог, если вы хотите записать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корнем. Пример Linux показан ниже

      Пользователь и только этот пользователь имеет доступ. В Linux хорошей практикой будет chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но каждый может читать)

      Предупреждение:
      включают(D: /MyProjects/testproject//functions/connections.php):
      не удалось открыть поток:

      Вы можете легко увидеть, где проблемы. Проблемы // перед функциями

      Так что просто удалите накладную / из include, и она должна работать нормально. Что интересно, это поведение отличается в разных версиях. Я запускаю один и тот же код на ноутбуке, Macbook Pro и на этом ПК, пока все работало нормально. Надеюсь, это кому-нибудь поможет.

      1. Скопируйте файл в браузере, чтобы убедиться, что файл существует. Иногда файлы неожиданно удаляются (случилось со мной), и это также было проблемой в моем случае.

      Другая возможная причина: переименование и / или перемещение файлов в текстовом редакторе. Я прошел все вышеописанные шаги безуспешно, пока не удалил файл, который продолжал выдавать эту ошибку, и создал новый, который исправил проблему.

      в PHP скриптах, будь то вызов include() , require() , fopen() , или их производные, такие как include_once , require_once , или даже move_uploaded_file() , часто возникает ошибка или предупреждение:

      не удалось открыть поток : нет такого файла или каталога.

      что такое хороший процесс, чтобы быстро найти первопричину проблемы?

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

      давайте рассмотрим, что мы устраняем неполадки в следующей строке:

      1. Проверьте путь к файлу для опечаток

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

      затем в терминале:

      2. Убедитесь, что путь к файлу верен относительно относительного и абсолютного пути

      • если он начинается с косой черты"/", то это не относится к корню папки вашего сайта( корню документа), а к корню ваш сервер.
        • например, каталог вашего сайта может быть /users/tony/htdocs
        • таким образом, не относительно пути корня вашего сайта или файла, в котором вы находитесь набрав
        • по этой причине, всегда используйте абсолютные пути к файлам

        чтобы сделать ваш скрипт надежным, если вы перемещаете вещи, все еще генерируя абсолютный путь во время выполнения, у вас есть 2 варианта:

          использовать require __DIR__ . "/relative/path/from/current/file" . The __DIR__ магической константы возвращает каталог текущего файла.

        определение SITE_ROOT константы себе :

          в корневом каталоге вашего сайта создайте файл, например config.php

        на config.php пишите

        в каждом файле, где вы хотите ссылаться на корневую папку сайта, включите config.php , а затем использовать SITE_ROOT константы везде, где вам нравится :

        эти 2 практики также делают ваше приложение более портативным, потому что оно не полагается на ini такие параметры, как путь включения.

        3. Проверьте свой путь включения

        другой способ включить файлы, ни относительно, ни чисто абсолютно, - это полагаться на включить путь. Это часто имеет место для библиотек или фреймворков, таких как Zend framework.

        такое включение будет выглядеть так:

        в этом случае вы захотите убедиться, что папка, в которой находится "Zend", является частью пути включения.

        вы можете проверить пути с :

        вы можете добавить в папку с :

        4. Проверьте, что ваш сервер имеет доступ к этому файлу

        возможно, что в целом пользователь, выполняющий серверный процесс (Apache или php), просто не имеет разрешения на чтение или запись в этот файл.

        чтобы проверить под каким пользователем запущен сервер можно использовать posix_getpwuid :

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

        5. Проверьте настройки PHP

        если ничего из вышеперечисленного не сработало, то проблема, вероятно, в том, что некоторые настройки PHP запрещают ему доступ к этому файлу.

        3 установки смогли быть уместны :

        1. функции
          • если это установлено, PHP не сможет получить доступ к любому файлу за пределами указанного каталога (даже через символическую ссылку).
          • однако поведение по умолчанию для него не должно быть установлено, и в этом случае нет никаких ограничений
          • это можно проверить, позвонив phpinfo() и с помощью ini_get("open_basedir")
          • вы можете изменить настройки, либо путем редактирования РНР.ini-файл или ваш httpd.файл conf
        2. безопасный режим
          • если это включено, могут применяться ограничения. Однако это было удалено в PHP 5.4. Если вы все еще находитесь в версии, поддерживающей безопасный режим обновления до версии PHP, которая все еще поддерживается.
        3. опция allow_url_fopen и allow_url_include
          • это относится только к включению или открытие файлов через сетевой процесс, такой как http:// not при попытке включить файлы в локальную файловую систему
          • это можно проверить с помощью ini_get("allow_url_include") и ini_set("allow_url_include", "1")

        если ни один из вышеперечисленных не позволяет диагностировать проблему, вот некоторые специальные ситуации, которые могут произойти:

        1. Включение библиотеки, опираясь на путь

        может случиться так, что вы включаете библиотеку, например Zend framework, используя относительный или абсолютный путь. Например :

        но тогда вы все равно получите ту же ошибку.

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

        для например, файл Zend framework, упомянутый ранее, может иметь следующее значение:

        который не является включением ни относительным путем, ни абсолютным путем. Предполагается, что каталог Zend framework добавлен в путь включения.

        в таком случае, единственным практическим решением является добавление в каталог к вашему пути.

        2. В SELinux

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

        чтобы проверить, включен ли SELinux в вашей системе запустите sestatus команда в терминале. Если команда не существует, то SELinux не в системе. Если он существует, то он должен сказать вам, является ли он принудительным или нет.

        чтобы проверить, являются ли политики SELinux причиной для проблемы, вы можете попробовать повернуть его временно выключен. Однако будьте осторожны, так как это полностью отключит защиту. Не делайте этого на рабочем сервере.

        если у вас больше нет проблемы с выключенным SELinux, то это является основной причиной.

        решить, вам придется настроить SELinux соответственно.

        необходимы следующие типы контекста:

        в любом случае, могут быть различные причины почему SELinux будет отказывать в доступе к файлу, в зависимости от ваших политик. Поэтому вам нужно будет исследовать это. здесь - это учебник по настройке SELinux для веб-сервера.

        3. В Symfony

        если вы используете Symfony и испытываете эту ошибку при загрузке на сервер, то может быть, что кэш приложения не был сброшен, либо потому что app/cache был загружен, или этот кэш не был очищенный.

        4. Не символы ACSII внутри Zip-файла

        по-видимому, эта ошибка может произойти и при вызове zip->close() когда некоторые файлы внутри zip имеют символы не ASCII в их имени файла, такие как "é".

        потенциальным решением является обертывание имени файла в utf8_decode() перед созданием целевой файл.

        кредиты Фран Кано для определения и предложения решения этой проблемы

        чтобы добавить к (действительно хорошему) существующему ответу

        попросите администратора сервера ознакомиться с руководством по использованию хостинга и веб-сервера.

        много раз люди будут решать проблему разрешений, делая следующее (пример Linux)

        это не очень умная идея, потому что файл или каталог теперь для. Если вы владеете сервером и являетесь единственным пользователем, это не такое уж большое дело, но если вы находитесь в общей среде хостинга, вы только что предоставили всем доступ к вашему серверу.

        что вам нужно сделать, это определить пользователя (ов), которые нуждаются в доступе и дают только те им доступ. Как только вы узнаете, какие пользователи нуждаются в доступе, вы захотите убедиться, что

        этот пользователь владеет файлом и, возможно, родительский каталог (особенно родительский каталог, если вы хотите записать файлы). В большинстве виртуального хостинга, это не будет проблемой, потому что ваш пользователь должен иметь все файлы под корень. Пример Linux показан ниже

        пользователь, и только пользователь, иметь доступ. В Linux хорошей практикой было бы chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но каждый может прочитать)

        В PHP скриптах, называя ли include() , require() , fopen() или их производные , такие как include_once , require_once или даже move_uploaded_file() , часто впадает в ошибки или предупреждения:

        Не удалось открыть поток: нет такого файла или каталога.

        Что такое хороший процесс, чтобы быстро найти причину проблемы?

        Я убрал не по теме комментарии к этому посту. Пожалуйста, держите мета обсуждения в мета. Тем не менее, обратите внимание, что обсуждение жизнеспособности канонических вопросов повторяется снова и снова. Смотрите пример здесь . У меня та же проблема, единственное решение, которое работало всегда: -1 Перейдите к файлу, чтобы включить, правильно, свойства, скопировать полный путь Например: C: /. / file.php 2- включить его. На самом деле я увидел, что на этот вопрос дан ответ, и ответ подтвержден, но у меня в некоторых случаях не получалось, пока я не нашел способ, описанный выше. @Rash спасибо за помощь. К сожалению, ваше решение неверно, потому что в нем будет указано абсолютное имя пути, а это неверно. Причина, по которой это неправильно, заключается в том, что в тот момент, когда вы копируете свой проект в другое место или перемещаете его в свой компьютер, все разрушается.

        Есть много причин, по которым можно столкнуться с этой ошибкой, и, таким образом, хороший контрольный список того, что проверять в первую очередь, значительно помогает.

        Давайте рассмотрим, что мы устраняем неисправности в следующей строке:

        1. Проверьте путь к файлу для опечаток

        или переместите все, что вызвано require* или include* к своей собственной переменной, отобразите его, скопируйте и попробуйте получить доступ к нему из терминала:

        Затем в терминале:

        2. Проверьте правильность пути к файлу относительно относительного или абсолютного пути

        • если он начинается с косой черты "/", то это относится не к корню папки вашего сайта (корню документа), а к корню вашего сервера.
          • например, каталог вашего сайта может быть /users/tony/htdocs
          • таким образом, не относительно пути корня вашего веб-сайта или файла, в котором вы печатаете
          • по этой причине всегда используйте абсолютные пути к файлам

          Чтобы сделать ваш скрипт надежным в случае, если вы перемещаете вещи, все еще генерируя абсолютный путь во время выполнения, у вас есть 2 варианта:

            использовать require __DIR__ . "/relative/path/from/current/file" . __DIR__ Постоянная магия возвращает каталог текущего файла.

          Определите SITE_ROOT константу самостоятельно:

            в корне каталога вашего веб-сайта создайте файл, например config.php

          в config.php , пишут

          в каждом файле, где вы хотите сослаться на корневую папку сайта, включите config.php , а затем используйте SITE_ROOT константу, где хотите:

          Эти 2 метода также делают ваше приложение более переносимым, поскольку оно не зависит от настроек ini, таких как путь включения.

          3. Проверьте ваш путь включения

          Другой способ включения файлов, ни относительный, ни сугубо абсолютный, заключается в использовании пути включения . Это часто относится к библиотекам или платформам, таким как Zend.

          Такое включение будет выглядеть так:

          В этом случае вам нужно убедиться, что папка, в которой находится «Zend», является частью пути включения.

          Вы можете проверить путь включения с помощью:

          Вы можете добавить в него папку с помощью:

          4. Убедитесь, что ваш сервер имеет доступ к этому файлу

          Может случиться так, что все вместе, пользователь, выполняющий процесс сервера (Apache или PHP), просто не имеет разрешения на чтение или запись в этот файл.

          Чтобы проверить, под каким пользователем работает сервер, вы можете использовать posix_getpwuid :

          Чтобы узнать разрешения для файла, введите в терминале следующую команду:

          5. Проверьте настройки PHP

          Если ничего из вышеперечисленного не сработало, возможно, проблема в том, что некоторые настройки PHP запрещают ему доступ к этому файлу.

          Три настройки могут быть актуальны:

            • Если это установлено, PHP не сможет получить доступ ни к какому файлу за пределами указанного каталога (даже через символическую ссылку).
            • Тем не менее, поведение по умолчанию для него не должно быть установлено, в этом случае нет никаких ограничений
            • Это можно проверить по телефону phpinfo() или с помощью ini_get("open_basedir")
            • Вы можете изменить настройку, отредактировав файл php.ini или файл httpd.conf.
            • если это включено, ограничения могут применяться. Однако это было удалено в PHP 5.4. Если вы все еще используете версию, которая поддерживает безопасный режим, обновите ее до версии PHP, которая все еще поддерживается .
            • это относится только к включению или открытию файлов через сетевой процесс, такой как http: // не при попытке включить файлы в локальную файловую систему
            • это можно проверить с помощью ini_get("allow_url_include") и установить с ini_set("allow_url_include", "1")

          Если ничего из перечисленного не позволяет диагностировать проблему, вот несколько особых ситуаций, которые могут произойти:

          1. Включение библиотеки с использованием пути включения

          Может случиться так, что вы включите библиотеку, например, Zend Framework, используя относительный или абсолютный путь. Например :

          Но тогда вы все равно получаете такую ​​же ошибку.

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

          Например, упомянутый ранее файл Zend Framework может содержать следующее:

          который не является ни включением ни по относительному пути, ни по абсолютному пути. Предполагается, что каталог Zend Framework был добавлен в путь включения.

          В таком случае единственное практическое решение - добавить каталог к ​​вашему пути включения.

          2. SELinux

          Если вы работаете в Security-Enhanced Linux, это может быть причиной проблемы, так как вы отказываете в доступе к файлу с сервера.

          Чтобы проверить, включен ли SELinux в вашей системе, выполните sestatus команду в терминале. Если команда не существует, значит SELinux отсутствует в вашей системе. Если он существует, то он должен сказать вам, применяется ли он или нет.

          Чтобы проверить, являются ли политики SELinux причиной проблемы, вы можете временно отключить ее. Однако будьте осторожны, так как это полностью отключит защиту. Не делайте этого на вашем производственном сервере.

          Если у вас больше нет проблемы с выключенным SELinux, то это является основной причиной.

          Чтобы решить эту проблему , вам необходимо соответствующим образом настроить SELinux.

          Следующие типы контекста будут необходимы:

          В любом случае может быть множество причин, по которым SELinux может запретить доступ к файлу, в зависимости от ваших политик. Так что вам нужно будет выяснить это. Вот учебник, посвященный настройке SELinux для веб-сервера.

          3. Symfony

          Если вы используете Symfony и сталкиваетесь с этой ошибкой при загрузке на сервер, возможно, кэш приложения не был сброшен, либо потому, app/cache что был загружен, либо этот кэш не был очищен.

          4. Не ACSII символы внутри Zip-файла

          По-видимому, эта ошибка также может возникать при вызове, zip->close() когда в некоторых файлах внутри zip-файла есть не-ASCII-символы в имени файла, такие как «é».

          Потенциальным решением является завершение имени файла utf8_decode() перед созданием целевого файла.

          Кредиты Фран Кано для выявления и предложения решения этой проблемы

          Большое спасибо за предложение. Поскольку я не знаком с SELinux, я немного почитал и попытался ответить на этот вопрос. Пожалуйста, не стесняйтесь оставлять отзывы или предлагать некоторые изменения, если они не верны. Еще раз спасибо за комментарий! chcon является временным и не переживет restorecon или перезагрузки. Возможно, вам придется использовать semanage для изменения контекста файла. Вот хороший простой урок для веб-сайта @chrishiestand спасибо большое! Эта статья действительно интересная! Вы помните, как развивались события, которые привели к этой ошибке? Было ли это, что изначально у пользователя не было доступа для чтения к файлу, затем он изменился, но кэш все еще считал, что он не читается, поэтому выдает эту ошибку при открытии файла?

          Добавить (действительно хороший) существующий ответ

          Попросите администратора сервера проконсультироваться с руководством по использованию программного обеспечения хостинга и веб-сервера, которое они используют.

          Часто люди решают проблему с разрешениями, выполняя следующее (пример Linux)

          Это не разумная идея, потому что файл или каталог теперь доступны для записи. Если вы являетесь владельцем сервера и являетесь единственным пользователем, то это не так уж важно, но если вы работаете в среде общего хостинга, вы только что предоставили всем доступ к своему серверу.

          Что вам нужно сделать, это определить пользователей, которым нужен доступ, и предоставить доступ только тем, кому они. Как только вы знаете, каким пользователям нужен доступ, вам нужно убедиться, что

          Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корнем. Пример Linux показан ниже

          Пользователь и только этот пользователь имеет доступ. В Linux хорошей практикой будет chmod 600 (только владелец может читать и писать) или chmod 644 (владелец может писать, но каждый может читать)

          Читайте также: