В PHP скриптах, называя ли include()
, require()
, fopen()
или их производные , такие как include_once
, require_once
или даже move_uploaded_file()
, часто впадает в ошибки или предупреждения:
Не удалось открыть поток: нет такого файла или каталога.
Что такое хороший процесс, чтобы быстро найти причину проблемы?
php
require
fopen
include-path
Vic Seedoubleyew
источник
источник
Ответы:
Есть много причин, по которым можно столкнуться с этой ошибкой, и, таким образом, хороший контрольный список того, что проверять в первую очередь, значительно помогает.
Давайте рассмотрим, что мы устраняем неисправности в следующей строке:
контрольный список
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 запрещают ему доступ к этому файлу.
Три настройки могут быть актуальны:
phpinfo()
или с помощьюini_get("open_basedir")
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.
Следующие типы контекста будут необходимы:
httpd_sys_content_t
для файлов, которые вы хотите, чтобы ваш сервер мог читатьhttpd_sys_rw_content_t
для файлов, к которым вы хотите доступ для чтения и записиhttpd_log_t
для файлов журналаhttpd_cache_t
для каталога кешаНапример, чтобы назначить
httpd_sys_content_t
тип контекста корневому каталогу вашего сайта, запустите:Если ваш файл находится в домашнем каталоге, вам также нужно включить
httpd_enable_homedirs
логическое значение:В любом случае может быть множество причин, по которым SELinux может запретить доступ к файлу, в зависимости от ваших политик. Так что вам нужно будет выяснить это. Вот учебник, посвященный настройке SELinux для веб-сервера.
3. Symfony
Если вы используете Symfony и сталкиваетесь с этой ошибкой при загрузке на сервер, возможно, кэш приложения не был сброшен, либо потому,
app/cache
что был загружен, либо этот кэш не был очищен.Вы можете проверить и исправить это, выполнив следующую консольную команду:
4. Не ACSII символы внутри Zip-файла
По-видимому, эта ошибка также может возникать при вызове,
zip->close()
когда в некоторых файлах внутри zip-файла есть не-ASCII-символы в имени файла, такие как «é».Потенциальным решением является завершение имени файла
utf8_decode()
перед созданием целевого файла.Кредиты Фран Кано для выявления и предложения решения этой проблемы
источник
selinux
может быть хорошей идеей здесь. по крайней мере, вам нужноhttpd_sys_content_t
разрешение (директории только для чтения и файлы, используемые Apache) на включенные файлы.chcon
является временным и не переживетrestorecon
или перезагрузки. Возможно, вам придется использоватьsemanage
для изменения контекста файла. Вот хороший простой урок для веб-сайтаДобавить (действительно хороший) существующий ответ
Программное обеспечение Shared Hosting
open_basedir
это тот, который может поставить вас в тупик, потому что он может быть указан в конфигурации веб-сервера. Хотя это легко исправить, если вы запускаете свой собственный выделенный сервер, существуют некоторые пакеты программного обеспечения для общего хостинга (такие как Plesk, cPanel и т. Д.), Которые настраивают директиву конфигурации для каждого домена. Поскольку программное обеспечение создает файл конфигурации (то естьhttpd.conf
), вы не можете изменить этот файл напрямую, потому что программное обеспечение хостинга просто перезапишет его при перезапуске.С Plesk они предоставляют место для переопределения предоставленного
httpd.conf
вызоваvhost.conf
. Только администратор сервера может написать этот файл. Конфигурация для Apache выглядит примерно такПопросите администратора сервера проконсультироваться с руководством по использованию программного обеспечения хостинга и веб-сервера, которое они используют.
Файловые права
Важно отметить, что выполнение файла через ваш веб-сервер сильно отличается от выполнения командной строки или задания cron. Большая разница в том, что у вашего веб-сервера есть свой пользователь и права доступа. По соображениям безопасности этот пользователь довольно ограничен. Apache, например, часто бывает
apache
,www-data
илиhttpd
( в зависимости от сервера). Задание cron или выполнение CLI имеет любые разрешения, которые есть у пользователя, выполняющего его (т. Е. Запуск сценария PHP от имени root будет выполняться с разрешениями root).Часто люди решают проблему с разрешениями, выполняя следующее (пример Linux)
Это не разумная идея, потому что файл или каталог теперь доступны для записи. Если вы являетесь владельцем сервера и являетесь единственным пользователем, то это не так уж важно, но если вы работаете в среде общего хостинга, вы только что предоставили всем доступ к своему серверу.
Что вам нужно сделать, это определить пользователей, которым нужен доступ, и предоставить доступ только тем, кому они. Как только вы знаете, каким пользователям нужен доступ, вам нужно убедиться, что
Этот пользователь владеет файлом и, возможно, родительским каталогом (особенно родительским каталогом, если вы хотите записывать файлы). В большинстве сред общего хостинга это не будет проблемой, потому что ваш пользователь должен владеть всеми файлами под вашим корнем. Пример Linux показан ниже
Пользователь и только этот пользователь имеет доступ. В Linux хорошей практикой будет
chmod 600
(только владелец может читать и писать) илиchmod 644
(владелец может писать, но каждый может читать)Вы можете прочитать более подробное обсуждение разрешений Linux / Unix и пользователей здесь
источник
Мой код работал нормально на всех машинах, но только на этом начали возникать проблемы (которые раньше работали, я думаю). Использовал echo "document_root" путь для отладки, а также внимательно посмотрел на ошибку, нашел это
Вы можете легко увидеть, где проблемы. Проблемы // перед функциями
Так что просто удалите накладную / из include, и она должна работать нормально. Что интересно, это поведение отличается в разных версиях. Я запускаю один и тот же код на ноутбуке, Macbook Pro и на этом ПК, пока все работало нормально. Надеюсь, это кому-нибудь поможет.
источник
Добавить скрипт с параметрами запроса
Это был мой случай. На самом деле это ссылка на вопрос # 4485874 , но я собираюсь объяснить это здесь в ближайшее время.
Когда вы пытаетесь потребовать
path/to/script.php?parameter=value
, PHP ищет файл с именемscript.php?parameter=value
, потому что UNIX позволяет вам иметь такие пути.Если вы действительно должны передать некоторые данные включены сценарии, просто объявить его как
$variable=...
или$GLOBALS[]=...
или другим способом , вам нравится.источник
Акции Самбы
Если у вас есть тестовый сервер Linux, и вы работаете с клиентом Windows, общий ресурс Samba вмешивается в команду chmod . Итак, даже если вы используете:
на стороне Linux вполне возможно, что Unix Group \ www-data все еще не имеет доступа для записи. Одно из рабочих решений, если ваш общий ресурс настроен так, что администраторы Windows сопоставлены с root: в Windows откройте Permissions, отключите Inheritance для вашей папки с копией, а затем предоставьте полный доступ для www-данных.
источник
Другая возможная причина: переименование и / или перемещение файлов в текстовом редакторе. Я прошел все вышеописанные шаги безуспешно, пока не удалил файл, который продолжал выдавать эту ошибку, и создал новый, который исправил проблему.
источник