Разрывать соеденение через n байт

_sokal_

Постоялец
Регистрация
25 Дек 2009
Сообщения
297
Реакции
142
Нужно подключаться к сайту, скачивать n байт станицы и обрывать соединение.
Как такое можно сделать?
нагуглил что можно сделать через CURLOPT_PROGRESSFUNCTION, но примера нигде нинашол.
 
Нужно подключаться к сайту, скачивать n байт станицы и обрывать соединение.
Как такое можно сделать?
нагуглил что можно сделать через CURLOPT_PROGRESSFUNCTION, но примера нигде нинашол.

странно, первая ссылка ведёт на пхп.нет в котором пример. К тому же два. Для просмотра ссылки Войди или Зарегистрируйся

+ на всякий случай- курл ппц какой тяжёлый. Если скорость критична - то лучше использовать сокеты.
 
Использую такое подключение
PHP:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback');
curl_setopt($ch, CURLOPT_BUFFERSIZE, 20);
$result = curl_exec($ch);
curl_close($ch);
Всёравно получает все страницу.
 
Использую такое подключение
PHP:
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, 'callback');
curl_setopt($ch, CURLOPT_BUFFERSIZE, 20);
$result = curl_exec($ch);
curl_close($ch);
Всёравно получает все страницу.

ну так надо считать сколько байтов считали и как только получили- закрыть соединение. В этой самой callback функции.
В CURLOPT_PROGRESSFUNCTION попробуй тупо закрыть соединение либо с помощью CURLOPT_READFUNCTION. - тут тупо нужно вернуть 0 или еол
 
Я когда-то возился с определением разрешения графических файлов, и как альтернатива getimagesize на php.net приводилась функция, которая читает только начало файла, заголовки (этого достаточно, чтобы выцепить его тип и размеры). Думаю, в твоём случае её тоже можно заюзать.

As noted below, getimagesize will download the entire image before it checks for the requested information. This is extremely slow on large images that are accessed remotely. Since the width/height is in the first few bytes of the file, there is no need to download the entire file. I wrote a function to get the size of a JPEG by streaming bytes until the proper data is found to report the width and height:


(с) Для просмотра ссылки Войди или Зарегистрируйся


Код:
<?php
// Retrieve JPEG width and height without downloading/reading entire image.
function getjpegsize($img_loc) {
    $handle = fopen($img_loc, "rb") or die("Invalid file stream.");
    $new_block = NULL;
    if(!feof($handle)) {
        $new_block = fread($handle, 32);
        $i = 0;
        if($new_block[$i]=="\xFF" && $new_block[$i+1]=="\xD8" && $new_block[$i+2]=="\xFF" && $new_block[$i+3]=="\xE0") {
            $i += 4;
            if($new_block[$i+2]=="\x4A" && $new_block[$i+3]=="\x46" && $new_block[$i+4]=="\x49" && $new_block[$i+5]=="\x46" && $new_block[$i+6]=="\x00") {
                // Read block size and skip ahead to begin cycling through blocks in search of SOF marker
                $block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
                $block_size = hexdec($block_size[1]);
                while(!feof($handle)) {
                    $i += $block_size;
                    $new_block .= fread($handle, $block_size);
                    if($new_block[$i]=="\xFF") {
                        // New block detected, check for SOF marker
                        $sof_marker = array("\xC0", "\xC1", "\xC2", "\xC3", "\xC5", "\xC6", "\xC7", "\xC8", "\xC9", "\xCA", "\xCB", "\xCD", "\xCE", "\xCF");
                        if(in_array($new_block[$i+1], $sof_marker)) {
                            // SOF marker detected. Width and height information is contained in bytes 4-7 after this byte.
                            $size_data = $new_block[$i+2] . $new_block[$i+3] . $new_block[$i+4] . $new_block[$i+5] . $new_block[$i+6] . $new_block[$i+7] . $new_block[$i+8];
                            $unpacked = unpack("H*", $size_data);
                            $unpacked = $unpacked[1];
                            $height = hexdec($unpacked[6] . $unpacked[7] . $unpacked[8] . $unpacked[9]);
                            $width = hexdec($unpacked[10] . $unpacked[11] . $unpacked[12] . $unpacked[13]);
                            return array($width, $height);
                        } else {
                            // Skip block marker and read block size
                            $i += 2;
                            $block_size = unpack("H*", $new_block[$i] . $new_block[$i+1]);
                            $block_size = hexdec($block_size[1]);
                        }
                    } else {
                        return FALSE;
                    }
                }
            }
        }
    }
    return FALSE;
}
?>
 
Назад
Сверху