Загрузка / Возобновление больших файлов в PHP с использованием собственных функций PHP - PullRequest
0 голосов
/ 13 декабря 2010

Мне нужно реализовать простой клиент для загрузки файлов на PHP, способный загружать как большие файлы, так и возобновлять их.

Есть ли способ, с помощью которого я могу загружать большие файлы (> 700 МБ) в PHP и при этом ограничивать объем памяти PHP до 128M?Я предполагаю, что это связано с записью в указатель файла.Любая подсказка, какие функции обработки файлов использовать?существует так много.Я предполагаю fopen, flock, (fwrite, fgets, fread), fclose.Или я должен использовать cURL?

Как возобновить загрузку, которая не работает?Тайм-аут выполнения сценария, сценарий остановки пользователя, время ожидания удаленного сервера и т. Д.?

Ответы [ 2 ]

2 голосов
/ 13 декабря 2010

Это должно быть возможно при использовании cURL, установив опции CURLOPT_FILE и CURLOPT_RESUME_FROM . Я не уверен, будет ли cURL перезаписывать файл или добавлять к нему, а также будет ли он буферизовать файл в памяти или записать его прямо на диск. Возможно, вам придется провести там несколько тестов.

Если вам нужен больший контроль над всем процессом, вы можете использовать fsockopen для создания необработанного соединения с сервером, с которого вы загружаете, и для записи и чтения из этого соединения с использованием обычного fread и fwrite функции. Вам нужно было бы отправить (fwrite) правильные заголовки HTTP в соединение, чтобы инициировать передачу - что наиболее важно, заголовок Range для возобновления передачи - и затем прочитать несколько байтов, используя fread , затем запишите их в файл и повторяйте, пока передача не будет завершена.

0 голосов
/ 13 декабря 2010

Проблема не в PHP, а в том, как файл отправляется. Хотя вы можете fopen() и fread() и т. Д. На сервере, как бы вы fopen() и fwrite() на стороне клиента? Стандартный Javascript не может открывать файлы из браузера, вам придется полагаться на другие методы, такие как (gulp) Java-апплеты или Flash-компонент (??) ...

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

...