LINUX.ORG.RU

Разный результат fopen

 


0

1

Доброго всем дня

Столкнулся с непонятной проблемой, не могу понять, что делать. Есть два сайта: уже работающий и новый, на который частично переносятся скрипты со старого. Старый существует в двух копиях: локальной для работы и в паблике. Во всех трёх копиях есть вот такой кусочек кода

$fp = fopen("./script/php/file.txt", "r");
$n = 71;
$text0 = fread($fp, $n);
Проблема заключается в том, что этот код отдаёт разный результат. Причём самое странное в этом следующее: обе копии старого сайта выдают одинаковый результат, а вот новый сайт - другой. Т.е. тут нет зависимости от системы, а какая-то загвоздка в коде. Но где и какая? Мне не понять. Файлы - копия.

var_dump ($fp) выдаёт такое:

resource(238) of type (stream) - для нового сайта

resource(47) of type (stream) - для старого



Последнее исправление: MAzZY (всего исправлений: 1)

То, что значение fopen разное, не ошибка, это просто дескриптор. А чем отличается результат, возвращаемый fread в этих случаях? Новый и старый сайт работают на одной машине?

amomymous ★★★
()
Ответ на: комментарий от amomymous

То, что значение fopen разное, не ошибка, это просто дескриптор.

А ошибки достаются так же через какую-нибудь errno?

mix_mix ★★★★★
()
Ответ на: комментарий от mix_mix

Нет, они вываливаются в stdout и в логи.
Но можно перехватить через set_error_handler
А проверить можно элементарно

if (false !== ($fp = fopen())) {
// работаем
}

kiotoze ★★★★
()
Последнее исправление: kiotoze (всего исправлений: 2)
Ответ на: комментарий от metrokto

Ну это же максимум убого, ещё хуже, чем в довольно низкоуровневом си (что полностью его и оправдывает). Нет чтобы человеческий объект возвращать, ну или хотя бы Result<T, IoError>.

mix_mix ★★★★★
()

Не проверяешь код возврата? ССЗБ.

anonymous
()
Ответ на: комментарий от mix_mix

Нет чтобы человеческий объект возвращать

$file = new SplFileObject("./script/php/file.txt", "r");
$text0 = $file->fread(71);

Плюс ассортимент библиотек в Composer.

KRoN73 ★★★★★
()
Ответ на: комментарий от anonymous

будет исключение, а дальше - try / catch (Exception $e)

anonymous
()
Ответ на: комментарий от mix_mix

Ну и как там у вас в 20-м веке? Молочка дорогая?

Сейчас чистый php используют столь же редко как чистую жаву

r_asian ★☆☆
()
Ответ на: комментарий от MrClon

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

Возвращает указатель на файл в случае успешной работы, или FALSE в случае ошибки.

Это скорее всего просто личное предпочтение

kiotoze ★★★★
()
Ответ на: комментарий от kiotoze

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

MrClon ★★★★★
()
Ответ на: комментарий от kiotoze

Чтобы как раз избежать дополнительного приведения типов, сразу проверяем жестко

Нет.

Это скорее всего просто личное предпочтение

В данном случае — да.
Однако, если бы ресурс мог иметь корректное значение 0, то проверка без сравнения с false могла бы ошибочно провалится.

metrokto ★★
()
Ответ на: комментарий от MrClon

Да

Это скорее всего просто личное предпочтение

kiotoze ★★★★
()

Всем спасибо за помощь. Похоже, проблема неожиданно решилась указанием режима rb

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

MAzZY
() автор топика
Ответ на: комментарий от metrokto

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

0 - это корректное значения для файлового дескриптора.

Deleted
()
Ответ на: комментарий от MAzZY

[protopopov-style]PHP - сложный язык с отсутзапутанной парадигмой и стандартной библиотекой, полной подводных камней и неприятных сюрпризов. Высот в таком языке обычно достигают люди с большим количеством альфасамцовых качеств. В том числе и отрицательных: грубость и эгоцентризм.[/protopopov-style]

heilkitty ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.