babahalki
Постоялец
- Регистрация
- 6 Май 2016
- Сообщения
- 247
- Реакции
- 107
- Автор темы
- #1
Привет.
Делаю либу для работы с удаленными файлами, а поскольку я сижу через очень долгий канал, каждое соединение добавляет по 150-200мс в итоге тестируя свою первую функцию filesize_remote() меня неприятно удивила задержка в 300мс, сначала 150мс первое соединение, а потом на еще 1 редирект 150мс. А я всего лишь увидел размер файла. Решил попробовать использовать http/2, сам протокол мне запустить удалось, но вот заставить curl использовать 1 соединение никак не получается.
Даже в таком примере происходит 2 соединения, судя по показаниям netstat -atc на сервере.
А браузер нормально работает через 1 соединение, даже если вручную в адресной строке вводить разные адреса 1 хоста.
Кому удавался трюк?
Делаю либу для работы с удаленными файлами, а поскольку я сижу через очень долгий канал, каждое соединение добавляет по 150-200мс в итоге тестируя свою первую функцию filesize_remote() меня неприятно удивила задержка в 300мс, сначала 150мс первое соединение, а потом на еще 1 редирект 150мс. А я всего лишь увидел размер файла. Решил попробовать использовать http/2, сам протокол мне запустить удалось, но вот заставить curl использовать 1 соединение никак не получается.
Код:
<?php
function callbackheader($ch, $hdr) {
//делим строку по двоеточию на 2 эл. максимум
$v = explode(':', $hdr, 2);
if(count($v) < 2){
//если двоеточия не было, тогда оставим старый ключ и значение
$key = 0;
$val = explode(' ', trim($v[0]));
}else{
$key = strtolower($v[0]);
$val = trim($v[1]);
}
$header[$key] = $val;
print_r($header);
return strlen($hdr);
}
function callbackdata($ch, $data) {
print $data;
return strlen($data);
}
$src = 'https://www.xiaomi2buy.ru/files/products/12101.10x10.jpg';
$ch = curl_init();
$opt = array(
CURLOPT_URL => $src, // устанавливаем URL
CURLOPT_PIPEWAIT => 1, //1 to wait for pipelining/multiplexing
CURLOPT_FOLLOWLOCATION => 1, //redirect to location header
CURLOPT_MAXREDIRS => 10, //max redirects
CURLOPT_HTTP_VERSION => 3, // пробуем использовать http/2
CURLOPT_SSL_VERIFYHOST => 0, //отключаем проверку соответсвия имени на сертификате хосту
CURLOPT_RETURNTRANSFER => 1, //вернуть результат через curl_exec($ch), а не на экран.
CURLOPT_HEADERFUNCTION => 'callbackheader',
CURLOPT_WRITEFUNCTION => 'callbackdata',
);
curl_setopt_array($ch, $opt);
print '<PRE>';
curl_exec($ch);
А браузер нормально работает через 1 соединение, даже если вручную в адресной строке вводить разные адреса 1 хоста.
Кому удавался трюк?