powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Сохранение удалённого файла на локальном сервере
6 сообщений из 6, страница 1 из 1
(PHP) Сохранение удалённого файла на локальном сервере
    #33067754
Николай_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть код:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
function http_get($url)
{
 $buffer = "";

   $url_stuff = parse_url($url);
   $port = isset($url_stuff['port']) ? $url_stuff['port'] :  80 ;

   $fp = fsockopen($url_stuff['host'], $port);

   $query  = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n";
   $query .= 'Host: ' . $url_stuff['host'];
   $query .= "\n\n";

   fwrite($fp, $query);

   while ($tmp = fread($fp,  1024 ))
   {
       $buffer .= $tmp;
   }
   preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts);
   return substr($buffer, - $parts[ 1 ]);
}

$fp = fopen ("/home/site/www/1.mp3", "w");
fwrite ($fp, http_get("http://site/musik/Trance.mp3"));
fclose ($fp);
При сохранении файлов небольшого размера, всё работает.
Как быть, когда файл занимает 50 и более Mb. Всё виснет.
Подскажите, может быть есть другой способ?
...
Рейтинг: 0 / 0
(PHP) Сохранение удалённого файла на локальном сервере
    #33067815
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Николай_При сохранении файлов небольшого размера, всё работает.
Как быть, когда файл занимает 50 и более Mb.Читать блоками и сразу их записывать в файл.
...
Рейтинг: 0 / 0
(PHP) Сохранение удалённого файла на локальном сервере
    #33067877
Николай_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А блоками, это как?
Записывать в файл лучше сразу после
Код: plaintext
preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts);
?
...
Рейтинг: 0 / 0
(PHP) Сохранение удалённого файла на локальном сервере
    #33067918
*
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
*
Гость
Во-первых, регулярник там этот нафиг не сдался. Всё, что вам нужно - это определить конец заголовка, который отделяется от контента пустой строкой. Фактически вам нужно сделать два цикла (либо же начинать запись в файл по флагу) - один читает всё в никуда до тех пор, пока не встретит пустую строку (trim($tmp)==''), а второй - читает данные из сокета и тут же их записывает. В этом случае вам не нужно будет иметь более 50 мегабайт оперативки (а её скорее всего в таком количестве скрипту не выдаётся), а достаточно будет гораздо меньше.
Есть правда ещё вариант что зависон из-за плохого коннекта - но это уже не лечится (разве что будете через Range кусками доставать). И вообще что-то мне подсказывает, что браузер (и Апаче) в ваших телодвижениях - лишний.
...
Рейтинг: 0 / 0
(PHP) Сохранение удалённого файла на локальном сервере
    #33070147
Николай_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
*один читает всё в никуда до тех пор, пока не встретит пустую строку (trim($tmp)==''), а второй - читает данные из сокета и тут же их записывает
вот вроде так работает..
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
function http_get($url)
{
   $url_stuff = parse_url($url);
   $port = isset($url_stuff['port']) ? $url_stuff['port'] :  80 ;

   $fp = fsockopen($url_stuff['host'], $port, $errno, $errstr);

if (!$fp) {
    echo "$errstr ($errno)<br>\n";
    exit;
} else {
   $query  = 'GET ' . $url_stuff['path'] . " HTTP/1.0\n";
   $query .= 'Host: ' . $url_stuff['host'];
   $query .= "\n\n";

   fwrite($fp, $query);

$headers = "";
while ($str = trim(fgets($fp,  4096 )))
  $headers .= "$str";

   $p = $_SERVER['DOCUMENT_ROOT']."/tmp/1.mp3";
   $f = fopen($p,"w");

   $body = "";
   while (!feof($fp))
{
   $body = fgets($fp,  4096 );
   fwrite ($f, $body);
}
   fclose ($f);
}
}
Проверял, файлы открываются без ошибок. Вроде правильно.
...
Рейтинг: 0 / 0
(PHP) Сохранение удалённого файла на локальном сервере
    #33070860
Comiljou
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Насколько я понимаю, это работает в твоем частном случае... Ты считываешь ОДНУ строку и считаешь что это был заголовок. А остальное записываешь в файл. Хотя если я не ошибаюсь заголовок должен состоять минимум из ЧЕТЫРЕХ строк (точно не понмю а проверять лень) почему это работает не знаю, но могу точно сказать что это не выход.
Если я неправ исправте пожалуйста.(у меня есть отмазка в виде пяти бутылок пива)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Сохранение удалённого файла на локальном сервере
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]