среда, апреля 23, 2008

PHP: первое использование сокета - это почти как первый поцелуй

Для сайта с каталогом недвижимости потребовалось написать разборщик удалённых файлов (веб-страниц). Тривиальная задача, но споткнулась о проблемы с открытием этих самых страниц. Стандартный способ через fopen() не работал. Через функции curl - то же самое. Масса других сайтов работает, но конкретный нужный - неа. Дошёл до того, что пошёл в удалённый порт 80 телнетом, изобразил примитивный HTTP-сеанс... и всё получил. Так какого чёрта.

Дальше просто описал в PHP то, что сделал руками: открывается сокет на $host, кричится в него:

GET $page HTTP/1.1
Host: $host
Connection: Close

...и подставляй ведро - пошли данные.

Тайна, оставшаяся тайной: если этот низкоуровневый способ работает, почему не работают fopen и curl? Одна догадка: проблемный хост генерит страницы тоже в PHP... при чтении страницы через сокет явно ощущается тайм-аут, после которого мой скрипт переходит к разборке данных... может быть, дело в незакрытом удалённым хостом соединении, из-за которого цивилизованное чтение обламывается с ошибкой, а моя дикарская функция возвращает-таки свой буфер? Не знаю, наблюдение за сеансом через Firebug не дало каких-то фактов в пользу этого, а вникать глубже мне лень и некогда, т. к. с этим разборщиком я уже стремительно приближаюсь к собственному тайм-ауту...

В общем, так: если не работают ни fopen(), ни функции curl, ни их имитация (есть примеры в инете) средствами того же fopen - простой fsockopen() может открыть дырку в заборе.

А про поцелуй... всегда считал, что кулхацкеров отличают от обычных людей два умения: написать что угодно на шелл-скрипте и работать через сетевые сокеты. Оказывается, про сокеты я был не прав... шелл-скрипты горааааздо мудрёнее, чесслово... :-)

Комментариев нет:

Поиск по этому блогу