国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

PHP 網(wǎng)絡(luò)編程小白系列 —— Accept 阻塞模型

darkbaby123 / 2822人閱讀

摘要:而之所以只打出一個(gè)和,是因?yàn)槟J(rèn)是阻塞的。那么本篇就介紹了經(jīng)典網(wǎng)絡(luò)模型阻塞模型,里面也涉及到了蠻多的知識(shí)點(diǎn),比較有意思,但是也提到了該模型效率較低,所以下一篇開始我會(huì)介紹效率更高的復(fù)用的網(wǎng)絡(luò)模型,敬請(qǐng)期待。

前面我們實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的 C/S 交互,接下來(lái)我們自然要介紹和學(xué)習(xí)一下常見的網(wǎng)絡(luò)交互模型

Accept 阻塞模型是一種相對(duì)古老的模型,不過里面蘊(yùn)含了許多有趣的知識(shí),比如阻塞/非阻塞、鎖、超時(shí)重傳...

服務(wù)端程序 acceptSever.php
 " . $ct_data . PHP_EOL;
            fwrite($conn, "Received $ct_size byte data./r/n");
            fclose($conn);
        }
        
        fclose($socket);
    }
}
new SocketServer(2000);
客戶端程序 acceptClient.php

代碼解析

首先,解釋一下以上的代碼邏輯:客戶端 acceptClient.php 循環(huán)發(fā)送數(shù)據(jù),最后發(fā)送結(jié)束符;服務(wù)端 accept Server.php 使用 accept 阻塞方式接收 socket 連接,然后循環(huán)接收數(shù)據(jù),直到收到結(jié)束符,返回結(jié)果數(shù)據(jù)(接收到的字節(jié)數(shù))客戶端收到服務(wù)器返回的數(shù)據(jù),寫入日志。雖然邏輯很簡(jiǎn)單,但是其中有幾種情況很值得分析一下:

A> 默認(rèn)情況下,運(yùn)行 php socket_client.php test,客戶端打出 10 個(gè) W,服務(wù)端打出若干個(gè) R 后面是接收到的數(shù)據(jù),socket.log 記錄下服務(wù)端返回的接收結(jié)果數(shù)據(jù),效果如下:

這種情況很容易理解,不再贅述。然后,使用 telnet 命令同時(shí)打開多個(gè)客戶端,你會(huì)發(fā)現(xiàn)服務(wù)器一個(gè)時(shí)間只處理一個(gè)客戶端,如圖所示:

其他需要在后面“排隊(duì)”;這就是阻塞 IO 的特點(diǎn),這種模式的弱點(diǎn)很明顯,效率極低。

B> 只打開 socket_client.php 第 29 行的注釋代碼,再次運(yùn)行 php socket_client.php test 客戶端打出一個(gè) W,服務(wù)端也打出一個(gè) R,之后兩個(gè)程序都卡住了。這是為什么呢,分析邏輯后你會(huì)發(fā)現(xiàn),這是由于客戶端在未發(fā)送結(jié)束符之前就向服務(wù)端要返回?cái)?shù)據(jù);而服務(wù)端由于未收到結(jié)束符,也在向客戶端要結(jié)束符,造成死鎖。而之所以只打出一個(gè) W 和 R,是因?yàn)?fread 默認(rèn)是阻塞的。要解決這個(gè)死鎖,必須打開 socket_client.php 第 17 行的注釋代碼,給 socket 設(shè)置一個(gè) 0.1 秒的超時(shí),再次運(yùn)行你會(huì)發(fā)現(xiàn)隔 0.1 秒出現(xiàn)一個(gè) W 和 R 之后正常結(jié)束,服務(wù)端返回的接收結(jié)果數(shù)據(jù)也正常記錄了。可見 fread 缺省是阻塞的,我們?cè)诰幊痰臅r(shí)候要特別注意,如果沒有設(shè)置超時(shí),就很容易會(huì)出現(xiàn)死鎖。

C> 只打開 14 行注釋設(shè)置腳本為非阻塞,運(yùn)行 php socket_client.php test,結(jié)果基本和情況 A 相同,唯一不同的是 socket.log 沒有記錄下返回?cái)?shù)據(jù),這是因?yàn)楫?dāng)我們非阻塞下客戶端不必等待接收到服務(wù)器的響應(yīng)結(jié)果就可以繼續(xù)往下執(zhí)行,當(dāng)執(zhí)行到 debug 的時(shí)候,讀取的數(shù)據(jù)還是空的,所以 socket.log 也是空的。這里可以看出客戶端運(yùn)行在阻塞和非阻塞模式的區(qū)別,當(dāng)然在客戶端不在乎接受結(jié)果的情況下,可以使用非阻塞模式來(lái)獲得最大效率。

D> 運(yùn)行 php socket_client.php 是連續(xù)運(yùn)行 10 次上面的邏輯,這個(gè)沒什么問題;但是很奇怪的是如果你使用 39 - 45 行的代碼,用 popen 同時(shí)開啟 10 個(gè)進(jìn)程來(lái)運(yùn)行,就會(huì)造成服務(wù)器端的死循環(huán),十分怪異!后來(lái)經(jīng)調(diào)查發(fā)現(xiàn)只要是用 popen 打開的進(jìn)程創(chuàng)建的連接會(huì)導(dǎo)致 fread 或者 socket_read 出錯(cuò)直接返回空字串,從而導(dǎo)致死循環(huán),查閱 PHP 源代碼后發(fā)現(xiàn) PHP 的 popen 和 fread 函數(shù)已經(jīng)完全不是 C 原生的了,里面都插入了大量的 php_stream_* 實(shí)現(xiàn)邏輯,初步估計(jì)是其中的某個(gè) bug 導(dǎo)致的 Socket 連接中斷所導(dǎo)致的,解決方法就是打開 socket_server.php 中 33 行的代碼,如果連接中斷則跳出循環(huán),但是這樣一來(lái)就會(huì)有很多數(shù)據(jù)丟失了,這個(gè)問題需要特別注意!

Accept 阻塞模型 結(jié)語(yǔ)

本來(lái)想著寫一篇關(guān)于 socket 網(wǎng)絡(luò)編程 和 網(wǎng)絡(luò)交互模型的過渡篇—— 進(jìn)程篇的,但是篇幅不是很多獨(dú)立成篇有點(diǎn)雞肋,所以打算把它放到后面——番外篇。那么本篇就介紹了 經(jīng)典網(wǎng)絡(luò)模型——Accept 阻塞模型,里面也涉及到了蠻多的知識(shí)點(diǎn),比較有意思,但是也提到了該模型效率較低,所以下一篇開始我會(huì)介紹 效率更高的I/O復(fù)用的網(wǎng)絡(luò)模型,敬請(qǐng)期待。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/29130.html

相關(guān)文章

  • PHP 網(wǎng)絡(luò)編程小白系列 —— 前言

    摘要:這跟國(guó)內(nèi)文化學(xué)習(xí)路徑編程意識(shí)都有關(guān)系,當(dāng)然還有一個(gè)重要原因就是沒有比較詳盡的資料無(wú)從下手,那么通過這系列文章我希望小白能夠走近網(wǎng)絡(luò)編程。 我們應(yīng)該要明白一點(diǎn):但凡涉及網(wǎng)絡(luò)的事務(wù),一定要經(jīng)過網(wǎng)絡(luò)的各個(gè)層次,PHP程序員可能更多地是在服務(wù)端的應(yīng)用層打交道很少接觸應(yīng)用層下面的傳輸層、網(wǎng)絡(luò)層。這跟國(guó)內(nèi) PHP文化、學(xué)習(xí)路徑、編程意識(shí)都有關(guān)系,當(dāng)然還有一個(gè)重要原因就是沒有比較詳盡的資料無(wú)從下手,...

    walterrwu 評(píng)論0 收藏0
  • PHP 網(wǎng)絡(luò)編程小白系列 —— Socket 編程入門

    摘要:在這個(gè)時(shí)刻,服務(wù)程序被驚醒并且為客戶提供服務(wù)對(duì)客戶的請(qǐng)求作出適當(dāng)?shù)姆磻?yīng)。為了方便這種模型的網(wǎng)絡(luò)編程,年代初,由聯(lián)合了其他幾家公司共同制定了一套下的網(wǎng)絡(luò)編程接口,即規(guī)范,它不是一種網(wǎng)絡(luò)協(xié)議而是一套開放的支持多種協(xié)議的下的網(wǎng)絡(luò)編程接口。 這篇文章將會(huì)介紹一下 Socket 編程中相關(guān)的 PHP 函數(shù),并簡(jiǎn)單實(shí)現(xiàn)一個(gè) C/S 的交互 Socket 簡(jiǎn)介 Socket 的官方解釋:在網(wǎng)絡(luò)編程中...

    DevWiki 評(píng)論0 收藏0
  • PHP回顧之socket編程

    摘要:如果你想體驗(yàn)原味編程,用開頭的比較適合否則建議使用流函數(shù)。有關(guān)流的知識(shí),請(qǐng)參考本人之前的博文回顧之流。接下來(lái)我們用流函數(shù)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的客戶端和服務(wù)端。流函數(shù)中的和兩個(gè)函數(shù)是我們想要的。本文目的是簡(jiǎn)要介紹中的編程,行文到此已經(jīng)達(dá)到目的。 轉(zhuǎn)載請(qǐng)注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請(qǐng)求 cookie w...

    tomorrowwu 評(píng)論0 收藏0
  • PHP并發(fā)IO編程之路

    摘要:下文如無(wú)特殊聲明將使用進(jìn)程同時(shí)表示進(jìn)程線程。收到數(shù)據(jù)后服務(wù)器程序進(jìn)行處理然后使用向客戶端發(fā)送響應(yīng)?,F(xiàn)在各種高并發(fā)異步的服務(wù)器程序都是基于實(shí)現(xiàn)的,比如。 并發(fā) IO 問題一直是服務(wù)器端編程中的技術(shù)難題,從最早的同步阻塞直接 Fork 進(jìn)程,到 Worker 進(jìn)程池/線程池,到現(xiàn)在的異步IO、協(xié)程。PHP 程序員因?yàn)橛袕?qiáng)大的 LAMP 框架,對(duì)這類底層方面的知識(shí)知之甚少,本文目的就是詳細(xì)介...

    Riddler 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<