скачивание больших файлов php
Как скачать несколько больших файлов с помощью PHP?
Я пытался загрузить несколько больших файлов с расширением zip php, но мне это не удалось, потому что время ожидания сервера всегда истекло.
После того, как я отключил ограничение времени для этого скрипта, я получил эту ошибку:
Кто-нибудь знает другой способ загрузки нескольких больших файлов с помощью php?
Решение
Похоже, вам нужно изменить пределы памяти и размера загружаемого файла, а также время выполнения вашего скрипта. Все можно изменить в вашем файле php.ini, хотя я бы изменил сценарий максимального времени выполнения сценарием, а не изменил бы его для всех запросов PHP.
МАКСИМАЛЬНОЕ ВРЕМЯ ИСПОЛНЕНИЯ
Изменить время выполнения можно двумя способами (внутри скрипта) …
1) Поместив строку ниже в верхней части вашего сценария. Это позволит сценарию работать бесконечно. Если вы хотите более детально контролировать продолжительность загрузки каждого файла, воспользуйтесь вторым предложением.
2) Используйте ту же строку в цикле, а не в начале скрипта, но измените количество секунд с 0 на столько времени, сколько вы хотите дать каждому файлу для загрузки. Это работает, потому что set_time_limit () сбрасывает время выполнения на ноль при каждом вызове.
Поэтому, если вы хотите, чтобы каждый файл имел 30 секунд, ваш цикл будет выглядеть примерно так …
ОБЪЕМ ПАМЯТИ & МАКС. РАЗМЕРЫ ФАЙЛОВ
Есть три параметра, которые вы должны изменить:
Если вы используете веб-хостинг, который не дает вам доступа к файлу php.ini, вы можете изменить их в своем скрипте или в файле htaccess (отрегулируйте значения для своих нужд) …
Если у вас есть доступ к файлу php.ini, просто измените настройки там!
Другие решения
Вы хотите, чтобы поток файла в кусках. Вот ТАК сообщение об этом: Скачать файл на сервер с URL
Загрузка файлов больших размеров в PHP
Те, кто уже пытался загружать файлы, вполне вероятно, обратили внимание на то, что загрузить файл через PHP даже среднего размера (15-20 МБ) не представляется возможным. А ведь это не такой уж и большой размер файла, и в этой статье я расскажу, как загружать файлы больших размеров в PHP.
Для того, чтобы загружать файлы больших размеров в PHP, надо исправить настройки интерпритатора PHP. Существуют 4 настройки, влияющие на максимальный допустимый размер загружаемого файла:
Фактически, чтобы загружать большие файлы в PHP, нужно исправить все 4 настройки. Делается это с помощью файла .htaccess, в который нужно добавить следующие строки (безусловно, значения можно менять на свои):
php_value max_execution_time 500
php_value max_input_time 500
php_value upload_max_filesize 30M
php_value post_max_size 30M
Почему все 4 опции так важны:
Однако, будьте внимательны! До бесконечности увеличивать эти параметры нельзя! Все эти настройки ограничены оперативной памятью, выделяемой Вам сервером. Запомните следующее неравенство, которое всегда должно соблюдаться: «upload_max_filesize
Копирование материалов разрешается только с указанием автора (Михаил Русаков) и индексируемой прямой ссылкой на сайт (http://myrusakov.ru)!
Добавляйтесь ко мне в друзья ВКонтакте: http://vk.com/myrusakov.
Если Вы хотите дать оценку мне и моей работе, то напишите её в моей группе: http://vk.com/rusakovmy.
Если Вы не хотите пропустить новые материалы на сайте,
то Вы можете подписаться на обновления: Подписаться на обновления
Если у Вас остались какие-либо вопросы, либо у Вас есть желание высказаться по поводу этой статьи, то Вы можете оставить свой комментарий внизу страницы.
Порекомендуйте эту статью друзьям:
Если Вам понравился сайт, то разместите ссылку на него (у себя на сайте, на форуме, в контакте):
Комментарии ( 9 ):
Спасибо, Михаил. Буду пробовать.
Михаил, а вы можете написать статью про обрезку изображений?
Хорошо, напишу эту статью.
Данный вопрос вы можете задать своему хостеру. Но в целом да,скорее всего так и есть.Обычно размер аттача одного файла не может превышать 30-50 мегабайт
Есть еще один удобный сервис который позволяет отправлять большие файлы. С его помощью можно отправлять больших файлы по электронной почте. Попробуйте www.jumbomail.me/ru/ вы сможете отправлять по электронной почте большие файлы до 5 ГБ бесплатно. Достаточно ввести адрес электронной почты получателя и загрузить их. Тут еще есть крутая фишка что можно просматривать фотки и слушать музыку не скачивая к себе в компьютер. Сама пользуюсь, рекомендую.
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.
Copyright © 2010-2021 Русаков Михаил Юрьевич. Все права защищены.
Отдаем файлы эффективно с помощью PHP
1. Используем readfile()
Метод хорош тем, что работает с коробки. Надо только написать свою функцию отправки файла (немного измененный пример из официальной документации):
Таким способом можно отправлять даже большие файлы, так как PHP будет читать файл и сразу отдавать его пользователю по частям. В документации четко сказано, что readfile() не должен создавать проблемы с памятью.
2. Читаем и отправляем файл вручную
Метод использует тот же Drupal при отправке файлов из приватной файловой системы (файлы недоступны напрямую по ссылкам):
3. Используем модуль веб сервера
3a. Apache
Модуль XSendFile позволяет с помощью специального заголовка передать отправку файла самому Apache. Существуют версии по Unix и Windows, под версии 2.0.*, 2.2.* и 2.4.*
В настройках хоста нужно включить перехват заголовка с помощью директивы:
Также можно указать белый список директорий, файлы в которых могут быть обработаны. Важно: если у Вас сервер на базе Windows путь должен включать букву диска в верхнем регистре.
Описание возможных опций на сайте разработчика: https://tn123.org/mod_xsendfile/
Пример отправки файла:
3b. Nginx
Nginx умеет отправлять файлы из коробки через специальный заголовок.
Для корректной работы нужно запретить доступ к папку напрямую через конфигурационный файл:
Пример отправки файла (файл должен находиться в директории /some/path/protected):
Скачивание больших файлов php
В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Совет: активация отображения всех ошибок в PHP
При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.
Агент
PHP парсер юзер агента с поддержкой Laravel, работающий на базе библиотеки Mobile Detect.
Закачка больших файлов или Как обойти ограничения дешевого виртуального хостинга
Однажды в очередной раз возникла задача о закачке относительно больших файлов. Говоря конкретно, клиент захотел заливать на сайт через админку видеоролики размером 20-40 мегабайт. Казалось бы, в наше просвещенное время подобный размер — это такая мелочь, о коей и говорить стыдно. Но внезапно все уперлось в настройки виртуального хостинга. Мы с ужасом обнаружили, что максимальный размер закачиваемого файла — 2M, и поменять эту цифру нет возможности. И менять хостинг по ряду причин нельзя — по крайней мере не сейчас.
Перед нами встает задача — обойти ограничения убогого виртуального хостинга. Сам принцип такого обхода очевиден: файл надо порезать на куски, залить частями, а на стороне сервера собрать в единое целое. Но делать это надо не вручную — пользователь должен выбрать файл и нажать на кнопку «Отправить». Как же это сделать?
Самая первая наша реакция — посмотреть возможности различных флеш-аплоадеров. Ведь не может быть, чтобы мировая техническая мысль не реализовала такой полезной вещи, как загрузка файла по частям. Перебираем последовательно Uploadify, SWFUpload, FancyUpload, jqUploader, jquery-transmit. Но все тщетно. Искомой фичи мы не видим. Вполне вероятно, что надо копать дальше, но время поджимает, и надо уже что-то делать…
Вышеописанное печально. Однако нам на руку играет тот факт, что это админка. Т.е. нам вовсе не нужно ориентироваться на кроссбраузерность. Достаточно того, что этот механизм будет работать на браузере клиента, каковым (о чудо!) является FF.
Тут же вспоминаем, что в FF последних версий есть возможность получить в строку содержимое файла, загруженного в поле file-upload. И в голову приходит желание разбивать эту строку на куски и закачивать частями, используя Ajax.
Клиентская часть
Сначала нарисуем необходимое в статическом HTML:
Теперь нам надо написать ту самую функцию big_file_upload:
Получение содержимого файла
Для получения содержимого файла будем использовать следующую конструкцию:
Поскольку содержимое у нас в формате Data:URL, то неплохо было бы отрезать заголовочную часть, в которой находится информация о MIME-типе и способе кодирования. В более общем варианте нашей функции эту информацию надо бы использовать, но в данном примере она нам только будет мешаться при декодировании. Поэтому просто отрежем все по первую запятую (включительно), которой отделяется заголовок:
Отправка файла кусками
Здесь все банально:
Серверная часть
Теперь сделаем на сервере принимающий PHP-скрипт upload.php. В варианте для примера он также предельно прост:
Файл открывается с опцией «а», т.е. предлагается не перезаписывать существующий файл, а дополнять его. Таким способом мы из кусков соберем целый файл.
Думаю, всем понятно, что данный скрипт должен лежать в закрытой админской части сайта чтобы к нему не имели доступа разные личности со стороны. Кроме того, имя файла и сам файл должны проверяться на валидность. Иначе — это даже не уязвимость, а… я и слова-то такого не знаю…
Пробуем запустить
Попробовали? Получилось? Держу пари, что получилось совсем не то, что ожидалось. Файл вроде бы закачался. Вроде бы даже длина правильная. А вот содержимое — какая-то каша.
Почему так получилось? Ответ прост: POST-запросы отправляются в асинхронном режиме по нескольку кусков одновременно, поэтому никто не гарантирует, что на сервер они будут приходить именно в той последовательности, в которой были поданы команды на отправку. Мало того, что никто не гарантирует, а я прямо-таки утверждаю, что никогда они не придут в нужной последовательности. Всегда будет получаться каша.
Поэтому, как это ни грустно, придется асинхронность отключить. Перед оправкой файла выполним следующее:
Теперь все нормально. Файл собирается в нужной последовательности, однако на время закачки исполнение прочих скриптов приостанавливается. Поэтому, чтобы не нервировать пользователя, было бы неплохо где-нибудь показывать процентики или прогресс-бар. Таким образом, работоспособный скрипт выглядит следующим образом: