fopen() не работает

Я хочу прочитать простую строку из текстового файла размером около 3-4 МБ, но fopen() не работает ("не удается открыть файл" из die()). Вот код:

clearstatcache();
$fh = fopen("/my/path/to/file.txt", "r") or die("can't open file");
$sql = fread($fh,filesize("/my/path/to/file.txt"));

person Tim Specht    schedule 06.09.2011    source источник
comment
есть такой файл? попробуйте без die, чтобы увидеть реальную ошибку   -  person k102    schedule 06.09.2011
comment
Вы проверяли разрешения? Кроме того, PHP в командной строке и PHP через Apache работают немного по-разному.   -  person Kumar    schedule 06.09.2011
comment
Кумар понял ›.‹ Опубликуйте это как ответ, и я отмечу, что он принят... извините за неудобства...   -  person Tim Specht    schedule 06.09.2011
comment
ПРЕКРАТИТЕ голосовать за эти 2 бессмысленных комментария. Нужно проверить определенное сообщение об ошибке, а не гадать. Помимо этих 2-х причин есть еще чертовски много.   -  person Your Common Sense    schedule 06.09.2011


Ответы (5)


Вы сначала проверили, существует ли файл?

if (!file_exists("/my/path/to/file.txt") { 
    die('File does not exist');
}

clearstatcache();

$fh = fopen("/my/path/to/file.txt", "r") or die("can't open file");
$sql = fread($fh,filesize("/my/path/to/file.txt"));
person pb149    schedule 06.09.2011
comment
Я изменил права доступа к файлам на 777, и после добавления метода clearstatcache мой скрипт заработал. - person Ultranuke; 20.06.2016
comment
Отсутствуют закрывающие скобки, но редактирование не позволяет изменить один символ :( if (!file_exists(/my/path/to/file.txt)) { - person Steve; 30.08.2016

вы должны добавить в свой код эту строку

error_reporting(E_ALL);

и ВСЕГДА сохраняйте эту строку во ВСЕХ ваших кодах

а еще эта строчка

ini_set('display_errors',1);

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

ini_set('display_errors',0);
ini_set('log_errors',1);

Сделав это, вам не понадобится помощь Stackoverflow для чтения теперь очевидных сообщений об ошибках.

person Your Common Sense    schedule 06.09.2011

Попробуйте вывести системные ошибки в die или попробуйте использовать try…catch. Также включите ошибки php во время разработки. Также проверьте, доступен ли файл для чтения, прежде чем открывать его.

Наиболее распространенные проблемы: файл не существует (или просто указан неверный путь?), недостаточно прав для чтения этого файла.

person YuS    schedule 06.09.2011

Измените эту вторую строку на:

$fh = fopen("/my/path/to/file.txt", "r") or die($php_errormsg);

и посмотреть, что он выводит в качестве причины.

person paxdiablo    schedule 06.09.2011
comment
@Col: я тоже не большой поклонник смерти, но задача состоит в том, чтобы выяснить, почему вызов не работает, а не перепроектировать весь код :-) - person paxdiablo; 06.09.2011
comment
нет необходимости перепроектировать какой-либо код. точно так же, как сообщения об ошибках доставляются разработчику - person Your Common Sense; 06.09.2011
comment
Если вы собираетесь пройти и удалить все операторы die, это является повторной архитектурой. Мы понятия не имеем, сколько тысяч этих зверей может существовать :-) Изменение аргумента на этот конкретный кубик — это изменение с минимальным воздействием, необходимое для предоставления необходимой информации. - person paxdiablo; 06.09.2011
comment
На самом деле это вы просите его переписать все выписки. Пока я только прошу включить error_reporting. - person Your Common Sense; 06.09.2011
comment
Нет смысла обсуждать это до смерти, @Col, я подозреваю, что нам придется согласиться не соглашаться. Я прошу изменить только один конкретный die, по которому нужна информация. Как только информация собрана, OP может делать то, что хочет (вернуть ее обратно, изменить их все, удалить их все, что угодно). Искусство обнаружения с минимальным воздействием жизненно важно для отладки, особенно в полевых условиях, и именно по этой причине я предложил этот ответ. - person paxdiablo; 06.09.2011
comment
В том-то и дело: нет причин менять этот конкретный кубик, если только вы не собираетесь его удалять. Более того, внесение в него системной ошибки было бы дырой в безопасности. - person Your Common Sense; 06.09.2011

На вашем FTP права доступа к файлам обычно должны быть 646 (или -rw-r--rw-), не 777 (всегда игнорируйте такие комментарии). Вы хотите передать ключ кому-то, кому вы доверяете, установка разрешений для 777 аналогична предоставлению копии вашего ключа всем.

person John    schedule 04.03.2018