Использование cURL для загрузки изображений в ZipArchive - PullRequest
0 голосов
/ 19 июля 2010

Я пытаюсь загрузить изображения в ZipArchive с сайта социальной сети через их API, я использую следующий код:

...
public function downloadAlbumZip($album_name, $photos)
{
    $zip = new ZipArchive();
    $album_name = $this->_cleanAlbumName($album_name);
    $filename = 'album.zip';
    $file = tempnam(PHOTOS, "{$album_name}-").'.zip';

    if ($zip->open($file, ZIPARCHIVE::CREATE) === TRUE)
    {
        foreach ($photos as $photo) {
            $image = $photo['pid'] . '.jpg';
            $binary = $this->_getImage($photo['src']);
            $zip->addFromString($image, $binary);
        }

        $output = print_r($zip, true);
        $zip->close();

        exit('Zip Saved.<br /><a href="javascript:history.go(-1);">Back to Album Overview</a>');
    } else {
        die('Zip Failed.');
    }
}

private function _getImage($img)
{
    if ( function_exists('curl_init') )
    {
        $ch = curl_init($img);

        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

        $rawdata = curl_exec($ch);
        curl_close($ch);

        return $rawdata;
    }
}
...

Что работает, но очень медленно и часто заканчивается ошибкой тайм-аута, кто-нибудь может порекомендовать способ ускорить это?

Спасибо

1 Ответ

1 голос
/ 19 июля 2010

Сначала загрузите все изображения, убедитесь, что с ними все в порядке, а затем повторно загрузите по тайм-ауту.

Вы можете ускорить загрузку изображений, выполнив их параллельно, используя CURL_MULTI_EXEC .

Помните, ключом к ускорению чего-либо является определение узкого места.Это архивирование файлов?Вы можете использовать собственный двоичный файл и использовать shell, если это так.Это загрузка изображений?Это размер изображений?

Вы должны выполнить некоторое профилирование, даже если оно просто повторяет time(), чтобы увидеть, какие операции занимают больше всего времени.

...