《PHP實例:PHP的Socket網絡編程入門指引》要點:
本文介紹了PHP實例:PHP的Socket網絡編程入門指引,希望對您有用。如果有疑問,可以聯系我們。
PHP實戰什么是TCP/IP、UDP?
PHP實戰???????? TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,是一個工業標準的協議集,它是為廣域網(WANs)設計的.
???????? UDP(User Data Protocol,用戶數據報協議)是與TCP相對應的協議.它是屬于TCP/IP協議族中的一種.
??????? 這里有一張圖,表明了這些協議的關系.
PHP實戰
PHP實戰TCP/IP協議族包括運輸層、網絡層、鏈路層.現在你知道TCP/IP與UDP的關系了吧.
Socket在哪里呢?
在圖1中,我們沒有看到Socket的影子,那么它到底在哪里呢?還是用圖來說話,一目了然.
PHP實戰
PHP實戰原來Socket在這里.
Socket是什么呢?
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口.在設計模式中,Socket其實就是一個門面模式,它把復雜的TCP/IP協議族隱藏在Socket接口后面,對用戶來說,一組簡單的接口就是全部,讓Socket去組織數據,以符合指定的協議.
你會使用它們嗎?
前人已經給我們做了好多的事了,網絡間的通信也就簡單了許多,但畢竟還是有挺多工作要做的.以前聽到Socket編程,覺得它是比較高深的編程知識,但是只要弄清Socket編程的工作原理,神秘的面紗也就揭開了.
一個生活中的場景.你要打電話給一個朋友,先撥號,朋友聽到電話鈴聲后提起電話,這時你和你的朋友就建立起了連接,就可以講話了.等交流結束,掛斷電話結束此次交談. 生活中的場景就解釋了這工作原理,也許TCP/IP協議族就是誕生于生活中,這也不一定.
PHP實戰
PHP實戰PHP的Socket編程概述
php5.3自帶了socket模塊,使得php具有socket通信能力,具體api可以參考官方手冊:http://php.net/manual/zh/function.socket-create.php, 具體實現跟c非常類似,只是少了內存分配和網絡字節序轉換這種底層操作
PHP實戰同時,php的pcntl模塊和posix模塊配合可以實現基本的進程管理、信號處理等操作系統級別的功能.這里有兩個非常關鍵的函數,pcntl_fork()和posix_setsid().fork()一個進程,則表示創建了一個運行進程的副本,副本被認為是子進程,而原始進程被認為是父進程.當fork()運行之后,則可以脫離啟動它的進程和終端控制等,也意味著父進程可以自由退出.pcntl_fork()返回值,-1表示執行失敗,0表示在子進程中,大于0表示在父進程中.setsit(),它首先使新進程成為一個新會話的“領導者”,最后使進程不再控制終端.這也是成為守護進程最關鍵一步,這意味著,不會隨著終端關閉而強制退出進程.對于一個不會被中斷的常駐進程來說,這是很關鍵的一步.進行最后一次fork(),這一步不是必須的,但通常都這么做,它最大的意義是防止獲得控制終端
PHP實戰什么是守護進程?一個守護進程通常被認為是一個不對終端進行控制的后臺任務.它有三個很明顯的特征:
PHP實戰最常見的實現方法:fork() -> setsid() -> fork(), 代碼里run_server()方法實現了守護進程.
PHP實戰server端socket監聽代碼
PHP實戰
<?php
// 接受客戶端請求,回復固定的響應內容
function server_listen_socket ($address, $port)
{
$buffer = "Msg from wangzhengyi server, so kubi...";
$len = strlen($buffer);
// create, bind and listen to socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (! $socket) {
echo "failed to create socket:" . socket_strerror($socket) . "\n";
exit();
}
$bind_flag = socket_bind($socket, $address, $port);
if (! $bind_flag) {
echo "failed to bind socket:" . socket_strerror($bind_flag) . "\n";
exit();
}
$backlog = 20;
$listen_flag = socket_listen($socket, $backlog);
if (! $listen_flag) {
echo "failed to listen to socket:" . socket_strerror($listen_flag) . "\n";
exit();
}
echo "waiting for clients to connect\n";
while (1) {
if (($accept_socket = socket_accept($socket)) == FALSE) {
continue;
} else {
socket_write($accept_socket, $buffer, $len);
socket_close($accept_socket);
}
}
}
function run_server ()
{
$pid1 = pcntl_fork();
if ($pid1 == 0) {
// first child process
// 守護進程的一般流程:fork()->setsid()->fork()
posix_setsid();
if (($pid2 = pcntl_fork()) == 0) {
$address = "192.168.1.71";
$port = "8767";
server_listen_socket($address, $port);
} else {
// 防止獲得控制終端
exit();
}
} else {
// wait for first child process exit
pcntl_wait($status);
}
}
// server守護進程
run_server();
PHP實戰運行效果
啟動服務器端socket進程,看是否在后臺運行,效果如圖:
PHP實戰
PHP實戰客戶端訪問,可以通過瀏覽器或者curl訪問,這里直接用curl訪問了
PHP實戰
《PHP實例:PHP的Socket網絡編程入門指引》是否對您有啟發,歡迎查看更多與《PHP實例:PHP的Socket網絡編程入門指引》相關教程,學精學透。維易PHP學院為您提供精彩教程。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/8806.html