Php programozás aljzatok

Sockets rendkívül kényelmes, de ugyanakkor a technológia kevéssé ismert kölcsönhatás a két folyamat között a hálózatban. Ezek a folyamatok lehetnek ugyanazon a gépen, egymással kommunikáló keresztül helyi socket szánt kommunikációs folyamatok közötti különböző gépeken, vagy az interneten keresztül. Bár aljzat téma igen kiterjedt, ez a cikk bemutatja az alapokat, amelyek szükségesek, hogy használja a PHP kiterjesztéseket, Ajánlott írás saját csatlakozó szerverek és kliensek.

Ahhoz, hogy használni foglalatok PHP kell fordítanunk a lehetőséget ./configure --enable-aljzat, vagy le kell tölteni a tágulási foglalat támogatja dinamikusan.

Tartsuk szem előtt, hogy az egyik példa a cikk későbbi részében, amelynek célja, hogy fut közvetlenül a héj környezetbe a parancssori PHP-verziót. Bár lehet futtatni egy web-böngésző, akkor nem ajánlott. Abban az esetben forgatókönyvek, hogy hozzon létre foglalatok szerverek, ezek használata bizonyítható bármilyen program képes kijelölni egy hálózati kapcsolat keresztül foglalatok, például telnet (ami valójában, akkor ajánlott).

Basics aljzatok

Bár sok fajta csatlakozó, valamennyi funkcióját aljzatok alapján ugyanazt az alapelvet - adatgyűjtő programot a program A. Ez a program futhat ugyanazon a gépen használva IPC (közlemény - IPC), vagy távoli gépek (például egy web-szerver és böngészők).

Az aljzatok megbízható legyen, az összes szükséges adatok továbbítására pontból a B pont (TCP). vagy megbízhatatlan, ha az adatokat anélkül, hogy a garancia a szállítás (UDP).

Foglalatok is „blokkoló” és a „nem-blokkoló”. Blokkoló foglalatok okozhat az alkalmazás várható mindaddig, amíg az adatok rendelkezésre állnak, míg a nem-blokkoló foglalatok nem. Bár, mint azt az alábbiakban bemutatjuk, minden foglalatok kétirányú, még mindig van egy különbség a kliens és a szerver socket.

Majd nézd meg a TCP socket Internet, mivel ezek a leggyakrabban használt ma. Ugyanakkor a fogalmak és kód példák itt megadott érvényes a legtöbb foglalat műveleteket.

Létrejön egy új foglalat

Függetlenül attól, hogy milyen típusú létrehozott foglalat (kliens vagy szerver), mindegyik inicializálódnak ugyanazt a módszert - segítségével socket_create () függvényt. A szintaxisa Ez a funkció a következő:

socket_create ($ domain, $ type, $ protokoll);

$ Domain - írja létre aljzat és meg kell tennie a következő értékek egyike a táblázatban felsorolt ​​konstans domének soketkyh vegyületek

$ Type - az interakció típusa, amely kerül sor az aljzat; értékek táblázatban felsorolt ​​állandók socket típus

$ Protocol - a protokoll által használt socket. Ez a paraméter bármilyen érvényes protokoll számát (lásd. A funkció getprotobyname ()) vagy konstans SOL_UDP vagy SOL_TCP TCP / UDP kapcsolatokat.

Ennek eredményeként ez a funkció sem adja vissza erőforrás, ami egy socket létrehozásakor vagy egy logikai érték egyébként false.

socket_create () funkció - ez az első kihívást jelent minden kölcsönhatást aljzatok. amely inicializálja a socket erőforrás, amely felhasználható a következő műveleteket. Így az aljzat használható helyileg - az IPC, és távolról - kliens / szerver stílusban. Összefüggésben egy adott alkalmazás a foglalat hívják saját domain. Elérhető PHP domének továbbított socket_create () függvény paramétere $ domain, állandók vannak beállítva a táblázatban:

Reading adatai egy előre meghatározott hosszúságú, vagy addig, amíg egy új sor karakter (\ r vagy \ n).

A lista mutatja egy példa segítségével aljzatok kivonat az index oldalon Web-site, ez magában foglalja az összes, ami a fent tárgyalt. Kivonása az indexlapot végezzük mobiltelefonra egy egyszerű HTTP 1.0 GET-kérelmet, majd elolvassa az eredményt a változó.

Figyelembe véve ezt az egyszerű példát kliens socket, most nézzük meg a másik oldalon a link - egy egyszerű szerver alapú aljzatok.

Létrehozása a szerveren aljzatok

socket_bind ($ socket, $ cím [, $ port]);

A második lépés: létrehozni egy socket hallgatni a forgalom próbál csatlakozni hozzá. Ezt használja socket_listen () funkció:

Amennyiben $ aljzat - az aljzat köti előtt, hogy fel kell venni a proslushinanie. Az opcionális paraméter $ a lemaradás létrehozásához használt megbízás megadásával maximális számát bejövő kapcsolatok kerülnek a sorban. Ha ez a paraméter nincs megadva, akkor az aljzat próbál kapcsolódni megkapja a szolgáltatás megtagadása, amíg a szerver socket nem elérhető. Ennek eredményeként a függvény egy logikai érték, amely jelzi a siker a beállításokat a szerver socket hallgatási.

A harmadik és egyben utolsó lépés létre egy szerver socket -, hogy a parancsot, hogy a bejövő kapcsolatok fogadására. Ez úgy történik, socket_accept () függvényt:

Amennyiben $ aljzat - aljzat kötött bele a meghallgatás, amely a kapcsolatok fogadására.

Elvégzése során ez a funkció nem fog visszatérni, amíg amíg hallgat a bejövő kapcsolatokat. Miután sikerült telepíteni, akkor a függvény egy új erőforrást a foglalat csatlakoztatásához használt. Ha a megadott paraméter az $ socket socket van kialakítva, nem blokkoló, socket_accept () függvény mindig azonnal visszatér hamis.

A foglalat erőforrás által visszaadott socket_accept (), nem lehet újra felhasználni, mivel az kizárólag egy adott aktuális kapcsolatban. Socket átadott az aljzatban paraméter $ azonban újra fel lehet használni.

Listing alatti aljzat létrehozott egy egyszerű szerver, amely elfogad egy kapcsolat, maximum 1024 bájt bemeneti és megjeleníti ezt az áramot a felhasználó számára.

Létrehozása egyszerű szerver-alapú socket

A számítógépen, ez a szkript a mappában Denver az úton: C: \ Web szerverekhez \ home \ app.loc \ www \ foglalatok \ test.php
Most, ha fut a script a parancssorban Makár: C: \ Web szerverekhez \ home \ app.loc \ www \ aljzatok> php test.php, látni fogjuk a következő parancsot:

A szerver küld nekünk vissza ugyanazt a lekérdezést + fejlécek:

A parancssorban, látni fogjuk, az új adatok

Csakúgy, mint egy új bemeneti prompt - bizonyíték arra, hogy a folyamat elájult. Azt is ellenőrizze a netstat -a parancsot, és Ubud, a port 4545 a listában nem szerepel.

Ahhoz, hogy hozzon létre egy kiszolgáló socket amely portokat figyelik 1000 alatt, a felhasználónak rendszergazdai jogosultságokkal kell rendelkeznie a rendszerben. Azt is meg kell jegyezni, hogy a fenti forgatókönyv nem áll le, amíg a kapcsolat létrejön, ami a benyomást kelti, „lebeg”.

Munka több aljzatok

A lista, a szerver alapú socket került bemutatásra az előző oldalon. Azonban ez nem túl kényelmes az igazi, a célok, mivel csak egy kapcsolat lehet az, hogy ugyanabban az időben. Ahhoz, hogy hozzon létre egy sokkal kényelmesebb socket szerver, meg kell tanulni, hogy egyszerre működik elosztót. Ehhez szükség lesz socket_select () függvény, melynek szintaxisa a következő:

socket_select ($ olvasni, $ Írása, $ Hiba, $ sec [, $ USEC]);

Itt $ olvasni, $ írási és $ error - átadása hivatkozás változók (valójában tömbök). Ezek a tömbök tartalmaznia kell egy listát az összes aljzatok kell ellenőrizni olvasási, írási és csapdába a hiba, ill. Például az aktív socket hely a tömb át a paraméter $ az olvasási, ez teszi a PHP ellenőrzi, hogy az aljzat olvasni az adatokat. Az utolsó két paraméter - $ sec, és egy opcionális $ usec - az időtúllépés értékét, ellenőrzik milyen hosszú a várakozás funkció socket_select (), mielőtt visszatért a PHP kezelése.

Ennek eredményeként a socket_select () függvény egy egész szám, amely meghatározza a számát módosított aljzatok (az átvitt listás), illetve módosítja tömbök $ olvasni, $ írási és $ error, eltávolítja őket az elemek, amelyek nem változtak. Ennek eredményeként minden egyes ilyen tömb tartalmazza csak egy listát a foglalatok, hogy megfeleljen a következő követelményeknek:

A foglalatok felsorolt ​​olvasási array $, adatokat tartalmazó lehet olvasni azokat, akár a bejövő kapcsolatokat velük.

A foglalatok felsorolt ​​írási array $ tartalmaznak írandó adatok nekik.

A foglalatok szerepel a tömbben $ error, tartalmazhat hibákat, amelyeket meg kell feldolgozni.

Abban az esetben hibás befejezése socket_select () függvény egy logikai érték hamis.

Ez az aljzat is hozzá kell adni a tömb $ olvasni, és futni fog vezérelt végtelen ciklusba. Ezután socket_select () függvény kerül megrendezésre felügyelet fő aljzat új kapcsolatokat. Amikor egy új kapcsolat automatikusan hívják socket_accept () függvény, amely létrehoz egy új szerver socket kommunikációra használják a csatlakoztatott kliens.

Ez az új dugaszoló majd nyomon követjük ugyanazt a hívást socket_select () (úgy, hogy hozzáadjuk az azonos tömb, amely már hozzá van adva, a fő csatlakozó) és alkalmazás-specifikus logika, amely a funkcionalitást a szervereket. Az alábbi jegyzék egy működő példa egy egyszerű fogadó szerver testreszabott kapcsolatok száma.

Létrehozása Multisort szerver PHP

A fenti felsorolás feltárt bizonyos korlátozások forgatókönyv PHP mechanizmust igénylő bonyolultabb alakú bypass socket_select () hívás:

$ Num_changed = socket_select ($ olvasni, $ NULL, $ NULL, 0, 10);

Figyeljük meg a változó nevű $ NULL. Az RNR funkció figyelembe véve a kapcsolat paraméterek (ahogyan azt socket_select (a) az első közelítés), NULL értéke érvénytelen. Azonban elhaladó NULL egy vagy több paraméter, felsorolja egészen helyes. Ezért a megoldás az, hogy ennek a változó $ NULL érték NULL:

És annak későbbi socket_select () függvény segítségével továbbítja.

Kapcsolódó cikkek