Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Сохранение удалённого файла на локальном сервере / 6 сообщений из 6, страница 1 из 1
16.05.2005, 16:53
    #33067754
Николай_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Сохранение удалённого файла на локальном сервере
Есть код:
Код: 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
16.05.2005, 17:07
    #33067815
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Сохранение удалённого файла на локальном сервере
Николай_При сохранении файлов небольшого размера, всё работает.
Как быть, когда файл занимает 50 и более Mb.Читать блоками и сразу их записывать в файл.
...
Рейтинг: 0 / 0
16.05.2005, 17:24
    #33067877
Николай_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Сохранение удалённого файла на локальном сервере
А блоками, это как?
Записывать в файл лучше сразу после
Код: plaintext
preg_match('/Content-Length: ([0-9]+)/', $buffer, $parts);
?
...
Рейтинг: 0 / 0
16.05.2005, 17:31
    #33067918
*
*
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Сохранение удалённого файла на локальном сервере
Во-первых, регулярник там этот нафиг не сдался. Всё, что вам нужно - это определить конец заголовка, который отделяется от контента пустой строкой. Фактически вам нужно сделать два цикла (либо же начинать запись в файл по флагу) - один читает всё в никуда до тех пор, пока не встретит пустую строку (trim($tmp)==''), а второй - читает данные из сокета и тут же их записывает. В этом случае вам не нужно будет иметь более 50 мегабайт оперативки (а её скорее всего в таком количестве скрипту не выдаётся), а достаточно будет гораздо меньше.
Есть правда ещё вариант что зависон из-за плохого коннекта - но это уже не лечится (разве что будете через Range кусками доставать). И вообще что-то мне подсказывает, что браузер (и Апаче) в ваших телодвижениях - лишний.
...
Рейтинг: 0 / 0
17.05.2005, 16:55
    #33070147
Николай_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Сохранение удалённого файла на локальном сервере
*один читает всё в никуда до тех пор, пока не встретит пустую строку (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
17.05.2005, 23:49
    #33070860
Comiljou
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
(PHP) Сохранение удалённого файла на локальном сервере
Насколько я понимаю, это работает в твоем частном случае... Ты считываешь ОДНУ строку и считаешь что это был заголовок. А остальное записываешь в файл. Хотя если я не ошибаюсь заголовок должен состоять минимум из ЧЕТЫРЕХ строк (точно не понмю а проверять лень) почему это работает не знаю, но могу точно сказать что это не выход.
Если я неправ исправте пожалуйста.(у меня есть отмазка в виде пяти бутылок пива)
...
Рейтинг: 0 / 0
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / (PHP) Сохранение удалённого файла на локальном сервере / 6 сообщений из 6, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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