Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

замута с сокетами

339
15 июня 2010 года
verybadbug
619 / / 12.09.2005
для работы с Transfer-Encoding: chunked написал функцию

http_read($url, $post, $cookies, &$header, &$response, $proxy = "", $proxy_port = "")
$url - адрес запроса
$post - данные (передаются методом POST)
$cookies - массив с куками
$header - возвращается http-заголовок
$response - возвращается содержимое
$proxy - адрес прокси (если прокси не используется ="")
$proxy_port - порт прокси (если прокси не используется, то "")

при чтении сайта - чанки (1ea1 2000 2000 2000 1000 c000), может это ещё не все, на последнем зависает (на какой строке - пометил).... немогу понять где затуп

my_fread - для чтения блоков, размер которых больше 8192

Код:
function my_fread($handle, $length) {
  $r = "";
  $s = "a";
  while ($length && strlen($s)) {
    $s = fread($handle, $length);
    $r .= $s;
    $length -= strlen($s);
  }
  return $r;
}
function http_read($url, $post, $cookies, &$header, &$response, $proxy = "", $proxy_port = "") {
  $header = "";
  $response = "";
 
  $parse_url = parse_url($url);
  $path = $parse_url["path"];
  if ($parse_url["query"]) { $path .= "?{$parse_url["query"]}"; }
  $host = $parse_url["host"];
  $target = $proxy == "" ? $host : $proxy;
  $port = $proxy_port == "" ? 80 : $proxy_port;

  $out = "POST {$path} HTTP/1.1\r\n";
  $out .= "Host: {$host}\r\n";
  $out .= "Referer: {$url}/\n";
  $out .= "User-Agent: Opera\n";
  if (is_array($cookies)) {
    foreach ($cookies as $value) {
      if ($value != "") { $out .= "Cookie: {$value}\r\n"; }
    }
  }
  $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
  $out .= "Content-Length: " . strlen($data) . "\r\n\r\n";
  $out .= "{$data}\r\n\r\n";
  if ($request = fsockopen($target, $port, $errno, $errstr)) {
    socket_set_timeout($request, 10);
    fwrite($request, $out);
    do {
      $header .= fread($request, 1);
    } while (!preg_match('/\\r\\n\\r\\n$/', $header));
    if (preg_match('/Transfer\\-Encoding:\\s+chunked\\r\\n/', $header)) {
      do {
        if (feof($request)) { break; }
        $chunk_size = "";
        $byte = fread($request, 1); //здесь зависает
        while ($byte != "\r") {
          $chunk_size .= $byte;
          $byte = fread($request, 1);
        }
        fread($request, 1);
        $chunk_size = hexdec($chunk_size);
        $response .= my_fread($request, $chunk_size);
        fread($request, 2);
      } while ($chunk_size);
    } else {
      if (preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/', $header, $matches)) {
        $response = fread($request, $matches[1]);
      } else {
        while (!feof($request)) { $response .= fread($request, 4096); }
      }
    }
    fclose($request);
  }
}


заранее благодарен за любую помощь
339
16 июня 2010 года
verybadbug
619 / / 12.09.2005
с зависанием проблему решил при помощи usleep(100000);
при работе через прокси - не полностью грузится контент :((
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог