Intereting Posts
PHP изменить URL-адрес без перенаправления на него? Ограничить длину ввода текста, содержащего HTML-теги Вычисление общего количества часов из базы данных Использование API для отправки ссылок не включает в себя изображение, название или мета-дескриптор PHP Проблема с переменной областью в PHP Pluck id (целое число), переданное в строку Laravel PDO отправляет необработанный запрос в MySQL, в то время как Mysqli отправляет подготовленный запрос, оба дают тот же результат Преобразовать число в формат xx.xx миллионов? Как получить cookie в php без обновления страницы? Как предотвратить межсайтовый скриптинг Нужно ли использовать следующую функцию для стирания строк в PHP? Как получить прозрачный фон после ротации png-изображения с помощью php? jQuery – Только изменение для элемента с щелчком, не все с тем же классом Как я могу запрашивать сообщения и использовать атрибут orderby для заказов в цикле в соответствии с датой meta_value? Цель Symphony2 Dynamic Logout?

file_get_contents загрузка большого файла

Я пытаюсь загрузить большой файл выше 2gb с помощью fsockopen. Но ниже появляется ошибка для file_get_content, я не могу хранить большой файл в памяти. Мне нужно отправить данные в куски, но не смог понять, как я буду выполнять эту операцию. Пожалуйста, кто-нибудь может вести меня?

Неустранимая ошибка: допустимый размер памяти 134217728 байт исчерпан (пытался выделить 727826869 байт) в

$file_info = finfo_open(FILEINFO_MIME); $mime_type = finfo_file($file_info, $file_loc); $file = file_get_contents($file_loc); $fp = fsockopen($host, 80, $errno, $errstr, 30); if ($fp) { $out = "POST /upload/".basename($url)." HTTP/1.1\r\n"; $out .= "Host: ".$host."\r\n"; $out .= "Accept-Language: en-US,en;q=0.8\r\n"; $out .= "Content-Type: ".$mime_type."\r\n"; $out .= 'Content-Length: ' . filesize($file_loc) . "\r\n"; $out .= "Content-Disposition: attachment; filename=\"".urlencode(basename($file_loc))."\"\r\n\r\n"; fwrite($fp, $out); fwrite($fp, $file); $response = ''; while (!feof($fp)) { $response .= fgets($fp, 128); } fclose($fp); 

Related of "file_get_contents загрузка большого файла"

file_get_contents возвращает содержимое целого файла как переменной. В вашем случае это означает, что он попытается создать переменную 2 ГБ, которая исчерпала бы память.

Попробуйте использовать fopen и fgets . Это позволит вам обрабатывать файлы в небольших кусках.

 $file_info = finfo_open(FILEINFO_MIME); $mime_type = finfo_file($file_info, $file_loc); $fileHandle = fopen($file_loc); $fp = fsockopen($host, 80, $errno, $errstr, 30); if ($fp) { $out = "POST /upload/".basename($url)." HTTP/1.1\r\n"; $out .= "Host: ".$host."\r\n"; $out .= "Accept-Language: en-US,en;q=0.8\r\n"; $out .= "Content-Type: ".$mime_type."\r\n"; $out .= 'Content-Length: ' . filesize($file_loc) . "\r\n"; $out .= "Content-Disposition: attachment; filename=\"".urlencode(basename($file_loc))."\"\r\n\r\n"; fwrite($fp, $out); while(!feof($fileHandle)){ fwrite($fp, fgets($fileHandle, 1024)); } fclose($fileHandle); $response = ''; while (!feof($fp)) { $response .= fgets($fp, 128); } fclose($fp); в $file_info = finfo_open(FILEINFO_MIME); $mime_type = finfo_file($file_info, $file_loc); $fileHandle = fopen($file_loc); $fp = fsockopen($host, 80, $errno, $errstr, 30); if ($fp) { $out = "POST /upload/".basename($url)." HTTP/1.1\r\n"; $out .= "Host: ".$host."\r\n"; $out .= "Accept-Language: en-US,en;q=0.8\r\n"; $out .= "Content-Type: ".$mime_type."\r\n"; $out .= 'Content-Length: ' . filesize($file_loc) . "\r\n"; $out .= "Content-Disposition: attachment; filename=\"".urlencode(basename($file_loc))."\"\r\n\r\n"; fwrite($fp, $out); while(!feof($fileHandle)){ fwrite($fp, fgets($fileHandle, 1024)); } fclose($fileHandle); $response = ''; while (!feof($fp)) { $response .= fgets($fp, 128); } fclose($fp); 

file_get_contents() вернет содержимое указанного url / файла и вернет эти данные в вашу переменную. Это означает, что если вы загружаете 10-гигабайтный файл, вам понадобится лимит памяти 10gig (плюс накладные расходы) в PHP.

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

Попробуйте прочитать файл в кусках, используя fopen и fread

 function readFileChunked($filename) { $chunksize = 512 ; // bytes per chunk $handle = fopen($filename, "rb"); if ($handle === false) return false; while (!feof($handle)) { print fread($handle, $chunksize); ob_flush(); flush(); } return fclose($handle); }