Библиотека для работы с Web на PHP

logo

Давным-давно, когда в моде еще был PHP4, я написал несложную библиотеку на PHP для работы с Web. Эта библиотека была достаточно примитивной, состояла из одного-единственного класса, содержала какие-то ошибки, но, тем не менее, она работала и была вполне юзабельной, поддерживала различные типы прокси-серверов, chunked-содержимое, сжатое содержимое и еще всякие приятные мелочи.

Однако, пришло время расширить функционал библиотеки, а заодно и полностью переписать ее с использованием новых возможностей ООП PHP5.

Итак, вот основные фишки новой библиотеки в сравнении со старой (жирным отмечены самые интересные особенности):

Характеристика Websock2 Websock
PHP4 - +
Не требует cURL + +
HTTP + +
HTTPS + -
GET-и POST-запросы + +
Удобная работа с HTTP-заголовками + -
File uploads + -
Автоматическое отслеживание cookies + -
Автоматическая обработка HTTP-редиректов + -
Установка referer при редиректах + -
Basic-аутентификация + -
Digest-аутентификация + -
Автоматическая basic/digest аутентификация + -
Chunked encoding + +
GZIPped-содержимое + +
Deflated-содержимое + -
HTTP-прокси + +
HTTP-прокси в режиме HTTPS + -
SOCKS4-прокси + -
SOCKS4a-прокси + -
SOCKS5-прокси + +
Аутентификация прокси + +
Цепочки прокси + -
Отслеживание таймаутов операций + -
Сокеты через file и socket_*-функции + +
Перехват HTTP-редиректов + -
Перехват чтения HTTP-заголовков и содержимого + -
Скачивание/загрузка очень больших файлов + -
Сделано по RFC + -
Удобная архитектура, простая расширяемость + -

Как видно из таблицы, новая библиотека содержит намного больше функций, чем старая. Более того, новая библиотека хорошо задокументирована (на английском) и содержит большое количество примеров.

Скачать архив (библиотека + примеры + документация): Websock2
Просмотреть документацию и примеры использования

Пожелания и вопросы можно оставлять в комментариях к посту или на нашем форуме.

На GitHub

Библиотека для работы с Web на PHP: 29 комментариев

  1. Спасибо, очень полезная вещь.
    Аналогов такого под РНР уж точно нет, даже первая версия была весьма удобной (на фоне того же курл и обычных сокетов).

    1. Что вообще такое "javascript cookie"? Это Cookies, которые выставляются через JavaScript? Тогда, очевидно, не может, потому что для этого нужен целый движок JavaScript'а, который будет его исполнять. Ну или парсить регулярками строки в JavaScript'е, которые устанавливают cookies.

    1. Вообще, вероятно я это поменяю, чтобы и в более ранних версиях работало. Сейчас будет работать в PHP5.4 и новее только.

  2. Обновил PHP все заработало. Появился еще один вопрос, в одном из примеров есть такая запись:
    //You can also create Socks5Proxy, Socks4AProxy and Socks4Proxy
    $proxy = new HttpProxy('proxy.address.here', 3128);

    Эту часть нужно менять (proxy.address.here) и почему именно 3128 порт. Просто если я оставляю в исходном состоянии то у меня выходит такая запись:

    Fatal error: Uncaught exception 'WebRequestException' with message 'Unable to connect to socket: Connection refused' in websock2.php:2890 Stack trace: #0 websock2.php(2087): FileSocket->open('proxy.address.h...', 3128) #1 websock2.php(2241): WebProxy->open('proxy.address.h...', 3128) #2 basic_proxy.php(15): HttpProxy->sendRequest(Object(WebRequest)) #3 {main} thrown in websock2.php on line 2890

  3. Могули ли я применить вашу библиотеку конкретно для использования ip хостинга где она установлена. Тоесть суть проста, иметь пару десятков хостингов и пользоваться ихними ip для серфинга на разных ресурсах принцып как у proxy. Если да, то как.

    За раннее спасибо!

    1. Это можно сделать, но не проще ли на хостинги поставить готовые прокси-сервера, чтобы не пришлось писать дополнительный код? Таких серверов уже куча сделана, в том числе на PHP.

  4. Попробовал немного либу. Напишу про то, что вызвало желание патчить либу.
    1) Поддержка php5.3, но вижу выше уже исправили [] на array
    2) namespace + 2 слеша и нет больше мусора в глобальном пространстве
    3) WebResponse возвращает хидеры как строку, а в 9 из 10 случаев нужно как распарсеный ассоц. массив. Такой метод нужен в самом классе WebResponse
    4)куки. Передо мной стоит проблема хранения кук. Я так понял, что можно парсить с полной строки, но нет перевода в полную строку. Сериализация всего класса не вариант, поэтому придется добавить метод перевода куки в полную строку. __ToString() почему то выдает только имя=значение. Как по мне, должны быть методы toShortString(), toLong(Full)String...

    1. 1 - исправлено.
      2 - опционально, просто не люблю неймспейсы в PHP. Говорить о том, что "НЕТ больше мусора в глобальном пространстве" - это вообще пушка, потому что там уже тысячи функций, классов и интерфейсов, и они никуда не денутся. Поэтому неймспейсы не сильно меняют дело.
      3 - Для разбора заголовков существует класс HttpHeaderManager. Не нужно смешивать WebResponse и HttpHeaderManager. Заголовки иногда вообще не нужны, и нет смысла тратить ресурсы на их разбор. Кстати, заголовки в общем случае - это не ассоциативный массив, так как ключи могут повторяться.
      4 - Чем отличается "полная строка" от "неполной"? Таких понятий в RFC нет. Cookie - это именно пара ключ=значение. А хранением Cookies занимается класс HttpCookieManager. Он вместе с классом HttpRequestManager позволяет организовать обработку Cookies на самом высоком уровне (парсинг, хранение, установка).

      1. Я все-таки не до конца понял: мне самому надо как-то организовывать хранение кук между выполнениями скрипта?
        Может я где-то упускаю аккуратное складывание всего-всего в файл?

  5. Как отправить пост запрос с Content-Type: application/json и телом
    {
    "CreateDetails": {
    "LicensePresetId": "c55065d0ee4ee2119baec86000bd38b2",
    "CustomerName": "Customer-45f",
    "Email": "[email protected]",
    "CodesQuantity": 1
    },
    "AccessInfo": {
    "VendorId": "f9a33c249b734a1889840d13768b90cc",
    "WebApiKey": "70dc5164b1d1e411ba5bc86000bd38b2"
    }
    }

  6. Hi, I was testing your library with google scraper I am writing, but I found 2 serious errors.
    As you know, when google presumes you are a bot, it redirects you to:
    https://ipv4.google.com/sorry/IndexRedirect?continue=https://www.google.com/search?q=allinur%253Adownload.php&ie=utf-8&oe=utf-8&gws_rd=cr&num=100
    So problems noticed are:
    1. during redirection, cookies won't be recorded from the final/landing page.
    2. if I put "false" as a return value on setOnRedirectCallback() I will receive the following error:
    We are redirected to: https://ipv4.google.com/sorry/IndexRedirect?continue=https://www.google.com/search%3Fq%3Dallinur%25253Aforce-download.php%26ie%3Dutf-8%26oe%3Dutf-8%26gws_rd%3Dcr%26num%3D100&q=CGMSBBiHfZUY2Jn0rQUiGQDxp4NLVSanA9BHZioBtMI_GyKNcs3lOi0

    Fatal error: Call to a member function getMethod() on a non-object in websock2.php on line 4131

  7. Столкнулся с проблемой обрезки заголовков. Сейчас делаю так же как и у тебя в методе getBody. Но недавно заметил, что сервер вернул несколько заголовков типа HTTP/1.1 100 Continue\r\n\r\nHTTP/1.1 200 OK, получается такой код обрезает только первый заголовок, а второй остаётся вместе с телом. Нагуглил только вот здесь что-то http://stackoverflow.com/questions/2964687/how-to-handle-100-continue-http-message но чёт не нравятся мне эти костыли. Какое решение оптимальное?

    1. Честно говоря, никогда с подобным не сталкивался, хотя часто работал с разными HTTP-серверами, поэтому не могу сразу посоветовать, что будет оптимальнее. Но судя по ссылке, сервер код 100 может вернуть, только если сам клиент этого попросил, отправив заголовок Expect: 100-continue.

  8. Приветствую.
    Подскажите пожалуйста, можно ли с помощью WebSocket2 общаться с секьюрными вебсокетами, по wss:// ? (куда писать заколовки на хендшейк, как отослать и как делать запросы и получать ответы)
    Я не просто делал это с помощью @stream_socket_client, просто , а теперь нужно через вебсокет общаться стало !!
    Если да, то как?
    Спасибо большое!

  9. Класс гавно, связки работают только с разными типами прокси. Как отправлять просто любую строку (пусть даже json) через POST так и не разобрался. Короче дно полное

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *