Работа със сокети в PHP

PHP позволява на скрипт да се свързва чрез сокет към всеки хост и порт, използвайки функцията fsockopen. Функцията fsockopen е предназначена за свързване на клиент към сървър. Много е удобен, защото е универсален и съчетава функциите, които PHP има за работа със сокети.

Пример за обмен на http заглавки между браузър и сървър. ------------------------------------------------ Заявка на клиент: GET /index.php HTTP/1.1 Хост: master-web.com.ua Потребителски агент: Mozilla/5.0 (X11; U; Linux i686; ru; rv:1.9b5) Gecko/2008050509 Firefox/3. 0b 5 Приемане: text/html Връзка: затваряне ------------------------------------------ Отговор на сървъра: HTTP/1.0 200 OK Дата: сряда, 11 февруари 2009 г. 11:20:59 GMT Сървър: Apache X-Powered-By: PHP/5.2.4-2ubuntu5wm1 La st-Modified: Wed, 1 1 Feb 2009 11:20:59 GMT Content-Language: en Content-Type: text/html; charset=utf-8 Дължина на съдържанието: 1234 Връзка: затворете

Клиентската заявка започва с команда GET. Всеки сървър трябва да поддържа поне две команди GET и HEAD. Вижте какви други основни команди съществуват: GET - използва се за искане на съдържанието на посочения ресурс (страница). В резултат на тази команда сървърът трябва да изпълни заявката и да върне отговор. По правило всички клиенти (браузъри) използват get, за да получат страница на сайта по url. 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:) посочваме в какъв формат искаме да получим данните. В реда (Връзка:) затваряме връзката. Това е добра практика, тъй като сървърът при достъп до него създава отделна връзка, която обслужва всички ваши следващи заявки. Ако обаче не е затворен, нищо няма да се случи, сървърът сам ще го затвори, но след определен период от време.

Пример за PHP код за заявка на страница чрез HTTP протокол:

В резултат на успешна връзка (отваряне на сокет), променливата $fp приема стойност и изпращаме текстова заявка до сървъра. Компилирането на правилна текстова заявка към сървъра е много важно, затова ще се опитам да го опиша подробно. Искането на клиент може да бъде няколко реда или може би десет реда. Всичко зависи от спецификата на заявката и какво искате да кажете на сървъра. Всеки ред (с изключение на първия) се състои от параметър и неговата стойност, разделени с двоеточие:, например Хост: master-web.com.ua, Референт: http://google.com/, Бисквитка: доход=1 и т.н. В края на реда трябва да има код за прекъсване на реда " ". Често пишат " ", където " " е преместване на ред, а " " е връщане на каретка към началото на реда. Цялата http заглавка завършва с двоен прекъсвач на ред, като Connection: Close или просто User-Agent: Mozilla/5.0 (съвместим; MSIE 6.0; Windows 98) . Попитайте: защо се нуждаете от двоен нов ред? Първо, според HTTP спецификацията двойното опаковане означава края на http заявката, и второ, не забравяйте, че POST предаването означава предаване на всички данни не в низа на заявката (във формата ..index.php?var1=1&var2=2), а вътре в http заявката:

Точно както двойният нов ред " " разделя http заявката от променливите, така той разделя http отговора на сървъра от съдържанието на страницата. Това кара клиентите (браузър) да показват страница без заглавка на отговор.

Списък с параметри, които могат да бъдат предадени на сървъра: Приемане Пример: Приемане: 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 Дефинира кодировки, с които нашият браузър/скрипт може да работи и би искал да използва при предаванедокумент. Бисквитка Пример: Бисквитка: var1=1;var2=2;type=blob; При предаване на бисквитка, глобалният масив $_COOKIE се създава въз основа на тази заглавка. Дължина на съдържанието Пример: Дължина на съдържанието: 1001 Дължина на данните в байтове, предадени след два прекъсвания на реда. От значение при предаване на данни чрез метода POST или когато сървърът отговаря на заявка. Размерът на предаваните данни трябва задължително да бъде равен на тази стойност, в противен случай сървърът няма да изпълни нищо, тъй като ще счита, че е получил непълен пакет данни. Въз основа на тази заглавка се създава променливата на средата $_SERVER["CONTENT_LENGTH"]. Content-Type Пример: Content-Type: text/html;charset=ISO-8859-4 Типът данни, които се предават в тялото на заявката. Полето Content-Type няма стойност по подразбиране. Keep-Alive Пример: Keep-Alive: 300 Определя времето в секунди, през което тази връзка със сървъра трябва да се поддържа (не трябва да се прекъсва). Референт Пример: Референт: info-pages.com.ua URL на страницата, от която клиентът е стигнал до тази страница. Въз основа на тази настройка се създава променливата на средата $_SERVER["HTTP_REFERER"]. Потребителски агент Пример: Потребителски агент: Mozilla/4.0 (съвместим; 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 означава протокол за контрол на предаването. TCP/IP - (Протокол за контрол на предаването/Интернет протокол) е набор от мрежови протоколи, които позволяват на компютри (от различни хардуерни платформи и операционни системи) да комуникират през свързани мрежи и през Интернет. Всеки компютър в интернет поддържа tcp/ip. Това е основният протокол, използван от Интернет. 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.