Робота з сокетами в PHP

PHP дозволяє скрипту з'єднатися за допомогою сокетів до будь-якого хоста та порту за допомогою функції fsockopen. Функція fsockopen призначена для з'єднання клієнта із сервером. Вона дуже зручна, оскільки є універсальною та поєднує в собі ті функції, які є в PHP для роботи із сокетами.

Приклад обміну http заголовками між браузером і сервером. -------------------------------- ---------- Запит клієнта: GET /index.php HTTP/1.1 Host: master-web.com.ua User-Agent: Mozilla/5.0 ( X11, U, Linux i686, ru; ------------------------------ Відповідь сервера: HTTP/1.0 200 OK Date: Wed , 11 Feb 2009 11:20:59 GMT Server: Apache X-Powered-By: PHP/5.2.4-2ubuntu5wm1 Last-Modified: Wed, 11 Feb 2009 11:20:59 GMT Content-Language: ru Content-Type: text/html; charset=utf-8 Content-Length: 1234 Connection: close

Запит клієнта розпочинається з команди GET. Кожен сервер повинен підтримувати як мінімум дві команди GET та HEAD. Подивіться які ще є основні команди: GET - використовується для запиту вмісту зазначеного ресурсу (сторінки). В результаті цієї команди сервер повинен виконати запит та повернути відповідь. Як правило, всі клієнти (браузери) для отримання сторінки сайту по URL використовують get. HEAD - аналогічний методу GET, крім того, що у відповіді сервера відсутня тіло. Тобто назад Ви отримаєте тільки заголовок відповіді сервера, але не код сторінки. POST - застосовується для передачі даних користувача заданому ресурсу. Ці дані можуть бути як файл або просто текст. Як правило, назва змінної та її значення. TRACE - повертає отриманий запит так, що клієнт можепобачити, що проміжні сервери додають чи змінюють у запиті.

Розбираємо запит клієнта далі. Після команди серверу йде частина URI запиту щодо хоста. Наприклад, у цьому випадку ми запитуємо вміст сторінки index.php, яка знаходиться у кореневому каталозі хоста. Але ми також можемо запросити і такий URI: /info/price.php?type=1 і він буде чудово працювати. Далі, в першому рядку запиту клієнта слід вказати вид протоколу, в даному випадку він вказаний як HTTP/1.1 (може бути і HTTP/1.0 і HTTP/0.9), але зазвичай використовують HTTP/1.0. У рядку (Host:) вказується назва хоста до якого ми надсилаємо http-запит. У рядку (User-Agent:) вказується назва клієнта (в даному випадку одна з версій браузера Mozilla). У рядку (Accept:) вказуємо у якому форматі ми хочемо отримати дані. У рядку (Connection:) ми закриваємо з'єднання. Це є правилом хорошого тону, оскільки сервер при зверненні до нього створює окреме з'єднання, яке обслуговує всі Ваші запити. Однак, якщо його не закрити нічого не станеться, сервер закриє його сам, але через певний проміжок часу.

Приклад PHP коду для запиту сторінки через протокол HTTP:

В результаті вдалого з'єднання (відкриття сокета) змінна $fp набуває значення і ми надсилаємо текстовий запит до сервера. Скласти правильний текстовий запит до сервера дуже важливо, тому я детально спробую його описати. Запит клієнта може складатися з кількох рядків, а може і з десятка рядків. Все залежить від специфіки запиту і того, що Ви самі хочете повідомити серверу. Кожен рядок (крім першого) складається з параметра та його значення розділені двокрапкою: наприклад, Host: master-web.com.ua , Referer: http://google.com/ , Cookie: income=1 і т.д. Наприкінці рядка обов'язково має бути код перенесення рядка " ". Часто пишуть " ", де " " - перенесення рядка, а " " - переклад каретки на початок рядка. Весь http-заголовок закінчується подвійним перенесенням рядка, наприклад, Connection: Close або просто User-Agent: Mozilla/5.0 (compatible; MSIE 6.0; Windows 98) . Запитайте: навіщо необхідне подвійне перенесення рядка? По-перше, згідно з специфікацією HTTP, подвійне перенесення означає закінчення http-запиту, а по-друге, згадайте, що POST передача передбачає передачу всіх даних не в рядку запиту (у вигляді ..index.php?var1=1&var2=2 ), а всередині http-запиту:

Як подвійне перенесення рядка " " відокремлює http-запит від змінних, так і відокремлює http-відповідь сервера від вмісту сторінки. Завдяки цьому клієнти (браузера) виводять сторінку на екран без заголовка відповіді.

Перелік параметрів, які можуть передаватися серверу: Accept Приклад: Accept: text/html, text/plain, image/gif, image/jpeg Ця рядок використовується клієнтом, що сказати серверу, які типи даних він сприймає. На основі цього заголовка створюється змінна оточення HTTP_ACCEPT_ENCODING. Accept-Encoding Приклад: Accept-Encoding: bzip2, gzip Визначає типи стиснення, з якими може працювати наш браузер/скрипт, і які бажано використовувати під час передачі документа (якщо сервер підтримує дані форматів стиснення). Accept-Language Приклад: Accept-Language: ru,en-us;q=0.7,en;q=0.3 Означає, яка розкладка клавіатури в нас встановлена ​​і якою мовою повинен повертатися запитаний документ. Accept-Charset Приклад: Accept-Charset: koi8-r;q=1.0, iso-8859-5;q=0.9, iso-8859-1;q=0.1 Визначає кодування, з якими може працювати наш браузер/скрипт, які бажано використовувати при передачідокумента. Cookie Приклад: Cookie: var1=1;var2=2;type=blob; Передача cookie на основі цього заголовка створюється глобальний масив $_COOKIE. Content-length Приклад: Content-length: 1001 Довжина даних у байтах, переданих після двох переносів рядка. Актуально під час передачі даних методом POST або коли сервер відповідає на запит. Розмір переданих даних повинен бути обов'язково дорівнює цьому значенню, інакше сервер нічого не виконуватиме, оскільки вважає, що отримав неповний пакет даних. На основі цього заголовка створюється змінна оточення $_SERVER["CONTENT_LENGTH"]. Content-Type Приклад: Content-Type: text/html;charset=ISO-8859-4 Тип даних, які передаються в запиті. Поле Content-Type не має значення за промовчанням. Keep-Alive Приклад: Keep-Alive: 300 Визначає час у секундах, протягом якого це з'єднання з сервером повинно утримуватися (не повинно розриватися). Referer Приклад: Referer: info-pages.com.ua URL сторінки, з якої клієнт перейшов на цю сторінку. На основі цього параметра створюється змінна оточення $_SERVER["HTTP_REFERER"]. User-Agent Приклад: User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1) Рядок, що описує браузер та ОС. На основі цього заголовка створюється змінна оточення $_SERVER["HTTP_USER_AGENT"].

Тепер можна повноцінно обмінюватися http-повідомленнями з будь-яким сервером, використовуючи сокети. При цьому Ви можете надіслати йому будь-яке значення одного із заголовків. Наприклад, якщо Ви включаєте в запит http-заголовок "User-Agent: Opera/7.23 (Windows 98; U) [en]", то сервер буде думати що у Вас встановлена ​​Windows 98 і працюєте Ви під Opera. А якщо ви вкажіть такий заголовок "Referer: google.com", то сервер вирішить, що Ви прийшли з Google сторінки.

Мережеві протоколи:

TCP – протокол управління передачею (Transmission Control Protocol). TCP/IP - (Transmission Control Protocol/Internet Protocol) - набір мережевих протоколів, дозволяють комп'ютерам (різних апаратних платформ і з різними операційними системами) взаємодіяти з'єднаних мереж і через Інтернет. Будь-який комп'ютер в Інтернеті підтримує tcp/ip. Це базовий протокол, який використовується Internet. UDP - додатковий компонент протоколу tcp, що підтримує службу датаграм, що виконується без підключень, не гарантує ні доставку, ні правильну послідовність доставлених пакетів (аналогічно протоколу ip). FTP - один із протоколів tcp/ip, який використовується для копіювання файлів з одного комп'ютера на інший через Інтернет. При цьому обидва комп'ютери повинні підтримувати відповідні ролі ftp: один має бути клієнтом ftp, а інший – сервером ftp. SSL - протокол, що забезпечує захист даних, що передаються за допомогою шифрів. TLS - стандартний протокол, що використовується для забезпечення безпеки веб-комунікацій в Інтернеті та інтрамережах. Дозволяє клієнтам перевіряти справжність серверів або (необов'язково) серверам перевіряти справжність клієнтів. Також забезпечує безпечний канал за рахунок шифрування з'єднань. Протокол tls є останньою і безпечнішою версією протоколу ssl. SMTP (Simple Mail Transfer Protocol) - що означає простий протокол передачі електронної пошти; POP (Post Office Protocol) - поштовий протокол для отримання електронної пошти.

У свою чергу в сімействі TCP/IP існують такі протоколи: HTTP - (Hypertext Transfer Protocol) протокол прикладного рівня передачі у першу чергу як текстових повідомлень. Основою http є технологія «клієнт-сервер», тоє клієнти посилають запит, а сервери, які чекають на з'єднання для отримання запиту, роблять необхідні дії і повертають назад повідомлення з результатом. Стандартний порт сервера 80 або 8080. HTTPS - розширення протоколу http, що підтримує шифрування. Https не є окремим протоколом. По суті, це звичайний http, що працює через шифровані транспортні механізми ssl і tls. Стандартний порт сервера 443.