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

Тема в разделе "Как сделать...", создана пользователем _sokal_, 30 июл 2013.

  1. _sokal_

    _sokal_

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

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    странно, первая ссылка ведёт на пхп.нет в котором пример. К тому же два. http://www.php.net/manual/fr/function.curl-setopt.php

    + на всякий случай- курл ппц какой тяжёлый. Если скорость критична - то лучше использовать сокеты.
     
  3. _sokal_

    _sokal_

    Регистр.:
    25 дек 2009
    Сообщения:
    300
    Симпатии:
    139
    Использую такое подключение
    PHP:
    $ch curl_init();
    curl_setopt($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    curl_setopt($chCURLOPT_PROGRESSFUNCTION'callback');
    curl_setopt($chCURLOPT_BUFFERSIZE20);
    $result curl_exec($ch);
    curl_close($ch); 
    Всёравно получает все страницу.
     
  4. KillDead

    KillDead

    Регистр.:
    11 авг 2006
    Сообщения:
    883
    Симпатии:
    540
    ну так надо считать сколько байтов считали и как только получили- закрыть соединение. В этой самой callback функции.
    В CURLOPT_PROGRESSFUNCTION попробуй тупо закрыть соединение либо с помощью CURLOPT_READFUNCTION. - тут тупо нужно вернуть 0 или еол
     
  5. etosh

    etosh Создатель

    Регистр.:
    22 июл 2013
    Сообщения:
    32
    Симпатии:
    4
    Я когда-то возился с определением разрешения графических файлов, и как альтернатива getimagesize на php.net приводилась функция, которая читает только начало файла, заголовки (этого достаточно, чтобы выцепить его тип и размеры). Думаю, в твоём случае её тоже можно заюзать.


    Код:
    <?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;
    }
    ?>