Как скачивает CURL

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Есть у нас такая функция:
PHP:
function download($from, $to)
{
    $fp = fopen ($to, 'w+');
    $ch = curl_init($from);
    curl_setopt($ch, CURLOPT_TIMEOUT, 50);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $result = (bool)curl_exec($ch);
    $curl_info = curl_getinfo( $ch );
    $curl_str = 'Ошибка curl: ' . curl_errno($ch) . ' - ' . curl_error($ch);
   
    curl_close($ch);
    fclose($fp);
   
    return array(
        'result' => $result,
        'info' => $curl_info,
        'error' => $curl_str,
        'from' => $from,
        'to' => $to
    );
}

Не большие файлы скачивает хорошо, а вот с большими проблема. Файл получается пустой.

Он как скачивает? Кусок скачал - записал, кусок скачал - записал ... или весь файл сначала скачивает?

Или может предложите другой вариант копирования файла с сервера к себе?

copy() не подходит, так как надо отслеживать заголовки и ошибки при копировании.
 
Судя по коду не вижу циклов => мы скачиваем целиком файл, затем пишем в файл.

Скорее всего упираешься в максимальный объём памяти или времени выполнения и до записи в файл дело просто не доходит.
 
Судя по коду не вижу циклов => мы скачиваем целиком файл, затем пишем в файл.

Скорее всего упираешься в максимальный объём памяти или времени выполнения и до записи в файл дело просто не доходит.
А для чего тогда есть CURLOPT_FILE? Думаю для того, что бы курл сам в цикле писал.

Иначе я могу и без этой опции
 
Если докачка поддерживается, скачивай частями.
Сначало получай размер файла, заодно определяй поддерживается ли докачка, потом частями скачивай и дописывай.
 
Попробуй задать запись данных через функцию
Код:
curl_setopt($ch,  CURLOPT_WRITEFUNCTION, 'DownloadFuction');

...
function DownloadFuction($curlHandle, $data) {
global $FP;
        fwrite($FP, $data);

        return strlen($data);
    }
 
А для чего тогда есть CURLOPT_FILE? Думаю для того, что бы курл сам в цикле писал.
не будет никакого цикла. по завершению операции в файл сбросится вывод и все.
а у вас как выше заметили, операция прерывается либо нехваткой памяти либо нехваткой времени.
 
Приветствую,

Есть у нас такая функция:
PHP:
function download($from, $to)
{
    $fp = fopen ($to, 'w+');
    $ch = curl_init($from);
    curl_setopt($ch, CURLOPT_TIMEOUT, 50);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    $result = (bool)curl_exec($ch);
    $curl_info = curl_getinfo( $ch );
    $curl_str = 'Ошибка curl: ' . curl_errno($ch) . ' - ' . curl_error($ch);

    curl_close($ch);
    fclose($fp);

    return array(
        'result' => $result,
        'info' => $curl_info,
        'error' => $curl_str,
        'from' => $from,
        'to' => $to
    );
}

Не большие файлы скачивает хорошо, а вот с большими проблема. Файл получается пустой.

Он как скачивает? Кусок скачал - записал, кусок скачал - записал ... или весь файл сначала скачивает?

Или может предложите другой вариант копирования файла с сервера к себе?

copy() не подходит, так как надо отслеживать заголовки и ошибки при копировании.
Закачка файла с докачкой при обрыве связи Для просмотра ссылки Войди или Зарегистрируйся
Работает через сокеты, там только 1 функцию подправить или закомментировать.
Или в этой теме загрузчик целиком — Для просмотра ссылки Войди или Зарегистрируйся
 
Последнее редактирование:
wget Для просмотра ссылки Войди или Зарегистрируйся сайт с данным пакетом / Скачал распаковать unzip !

запуск установки sh intall.sh
 
Последнее редактирование модератором:
CURLOPT_FILE - Файл, в который будет записан результат передачи. По умолчанию используется поток вывода STDOUT (окно браузера).

Т.е. просто указывает, что результат нужно не выводить на экран, а передать файловой системе. Но до получения результата никто это делать не будет - скрипт отваливается раньше.
 
если файлы не гигантские (Gb) то можно просто в начале поставить
set_time_limit(0) и увеличить CURLOPT_TIMEOUT например до 300 (5 минут)
 
Назад
Сверху