Как определить размер файла более 4 ГБ средствами PHP?
Итак, собснно, вопрос встал в определении файла более 4 Гб средствами PHP. Встроенная функция filesize() определяет размер файла корректно только до 2 Гб, но при неких манипуляциях можно добиться определения до 4 Гб.
Есть корпоративный хостинг, грубо говоря облако, так что попадаются файлы и под 20-25 Гб.
Находил некий костыль когда-то, который позволяет получать размер файла из консоли через exec(), но мне нужна кросплатфоменность.
Знает ли кто-нибудь подобное решение, или использует класс какой-нибудь? Буду очень благодарен!
UPD:
Есть еще решение под curl, но его я отбросил сразу, ибо он кушает ресурсы, да и время на считывание файла 25Гб будет велико.
Замечание: Так как тип integer в PHP является целым числом со знаком и многие платформы используют 32-х битные целые числа, то некоторые функции файловых систем могут возвращать неожиданные результаты для файлов размером больше 2ГБ.
Наверное, это тоже будет костыль, но можно открывать файл с помощью fopen() и считать количество символов-байтов, хоть это и бред. Еще можно попробовать разбить большой файл на много мелких по 2 гб и суммировать уже их размеры, но в этом случае он будет не совсем точным. В общем, ничем не помог, зря ответ писал :)
госпади упаси, fseed+ftell. Но опять же на x86 версии не выйдет, интов вам не хватит. Обычно проблему люди решают кастылями с exec и вызовом команд из баша.
Прошерстив форумы пришёл к этому же выводу... Печаль, видел еще надстройку над пэхой, которая увеличивает размер загружаемого файла, просто переписывая код для $_FILES[]
@Fesor fseed+ftell на на 64 битной не потребуется, время выполнения скрипта увеличится. А на 32 таким способом только до 4 Гб дойдет. Короч второй день голову ломаю как сделать проще и самое главное чтобы не жрало ресы, ну и время выполнения было приемлемое.
Просто сносить столько всего придется, плюс там файлов куча пользовательских. Если только сначала настраивать другую машину, а потом уже туда все грузить... Пока вижу только такой вариант
Но может быть так, что exec() нельзя будет выполнить на сервере или некоторые утилиты в chroot окружении будут недоступны, тот же du, система может определиться неверно, много подводных камней и тут.