Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как в php определить, есть ли соединение? fsockopen 
:(
    Опции темы
kanaris
Дата 1.7.2010, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: -1
Всего: -1



Код

$sock=fsockopen('localhost',80);

$buf='';
fwrite($sock,"GET / HTTP /1.1\r\nHost: localhost\r\nConnection: close\r\n\r\n");
while(!feof($sock))$buf.=fgets($sock);


После отправки запроса и получения ответа соединение сервер закрывает. А вот дескриптор $sock все еще остается жив.
Есть ли какие-нибудь способы проверить, закрылось ли соединение? 

Это сообщение отредактировал(а) kanaris - 1.7.2010, 23:28
PM MAIL   Вверх
Kano
Дата 1.7.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 23.2.2009

Репутация: 1
Всего: 0



Запрос неправильный.
PM MAIL   Вверх
ksnk
Дата 1.7.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 96
Всего: 386



может так?
Код

while(!feof($sock))$buf.=fgets($sock);


Это сообщение отредактировал(а) ksnk - 1.7.2010, 23:14


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
kanaris
Дата 1.7.2010, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: -1
Всего: -1



Цитата

Запрос неправильный. 


Ну это к примеру, написал от руки, пока постил вопрос. (ну да, не стоит \r\n\r\n в конце, забыл).
В принципе, пока вы отвечали, проблему удалось решить "хирургическим" методом, посылая данные и запрашивание ответа. Если ошибка, значит не соединено и переподключается.

Но хотелось бы это выявить какими-нибудь цивилизованными методами (если бы существовала какая-нить функция "is_socked_connected($sock)" к примеру)

UPD:

Цитата

может так?
Код

while(!feof($sock))$buf.=fgets($sock);



Прошу простить мелкие опечатки, писал от руки для простого примера, может еще что-то забыл добавить, не важно (в оригинале все правильно и с этим проблем нет).

Это сообщение отредактировал(а) kanaris - 1.7.2010, 23:24
PM MAIL   Вверх
Kano
Дата 1.7.2010, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 23.2.2009

Репутация: 1
Всего: 0



kanaris, такого в общем-то нет. Обычно это делается с помощью таймаута, т.е. создаётся неблокирующие сокеты и проверяются готов ли он к чтению/записи после определённого времени...

Зачем тебе это требуется в данном случае?

P.S. HTTP/1.1 нежелательно использовать в таких запросах. 
PM MAIL   Вверх
kanaris
Дата 1.7.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: -1
Всего: -1



Делаю класс, при помощи которого можно получить несколько веб-страниц за одно соединение. Все в принципе работает, но хотел еще добавить 1 функцию, которая бы объединяла в себе 3 действия (соединить, отправить, получить). А раньше приходилось делать так:

Код

$httpsock=new httpSocket;
$httpsock->connect('example.com:80',10);// 10 - это таймаут
$httpsock->send('/index.php',null,null,array('Connection'=>'keep-alive','Keep-Alive'=>'30'));// гет, пост, файлы, доп. хттп-заголовки
$r=$httpsock->readAll(); // возвращает массив: headers=>'заголовки',body=>'тело'
$httpsock->send('/index2.php');
$r=$httpsock->readAll();
if(!$httpsock->connect('example.com:80',10))die();// снова соединяемся, т.к. по умолчанию сервер закрывает соединение, если не указать Connection: keep-alive
$httpsock->send('/index3.php',null,null,array('Connection'=>'keep-alive','Keep-Alive'=>'30'));// гет, пост, файлы, доп. хттп-заголовки
$r=$httpsock->readAll(); // возвращает массив: headers=>'заголовки',body=>'тело'



Теперь достаточно так:

Код

$httpsock=new httpSocket;
$httpsock->connect('example.com:80',10);
$r1=$httpsock->page('/index.php',null,null,array('Connection'=>'keep-alive','Keep-Alive'=>'30'));
$r2=$httpsock->page('/index2.php');
$r3=$httpsock->page('/index3.php',null,null,array('Connection'=>'keep-alive','Keep-Alive'=>'30'));

PM MAIL   Вверх
Kano
Дата 2.7.2010, 00:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 23.2.2009

Репутация: 1
Всего: 0



kanaris, я вижу полноценное решение только через функции http://ru2.php.net/manual/en/ref.sockets.php Плюс, как ты понимаешь, придётся делать полноценный анализ ответа (включая поддержку chunked encoding).
PM MAIL   Вверх
kanaris
Дата 4.7.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: -1
Всего: -1



Цитата

Плюс, как ты понимаешь, придётся делать полноценный анализ ответа (включая поддержку chunked encoding)


да понимаю, сделал и chukned и content-length, все работает (а остальное, если что-то там будет, тоже доделаю).
пока что проблему решил, как описал во 2 своем посте.
PM MAIL   Вверх
NewDima
Дата 5.7.2010, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: 10
Всего: 12



Цитата(Kano @ 2.7.2010,  06:38)
P.S. HTTP/1.1 нежелательно использовать в таких запросах.

Аргументируйте
PM ICQ   Вверх
Kano
Дата 5.7.2010, 09:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 95
Регистрация: 23.2.2009

Репутация: 1
Всего: 0



NewDima, с тем же chunked encoding разбираться (в любом случае), разбираться со сжатым контентом (не все сервера смотрят за Accept-Encoding) и т.п. По-моему, очевидно. Далеко не все понимают различий HTTP/1.0 и HTTP/1.1, когда пишут подобные "сырые" запросы.

Имеется ввиду не сам HTTP-запрос, а код запроса на PHP.

Это сообщение отредактировал(а) Kano - 5.7.2010, 09:12
PM MAIL   Вверх
kanaris
Дата 5.7.2010, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 70
Регистрация: 16.2.2008

Репутация: -1
Всего: -1



Вся соль в том, что нужно делать несколько запросов за одно соединение. А http 1/0 не поддерживает такое, на сколько я знаю smile
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0795 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.