PHP socket初探 --- 關於IO的一些枯燥理論
阿新 • • 發佈:2018-11-16
[原文地址:https://blog.ti-node.com/blog...]
要想更好了解socket程式設計,有一個不可繞過的環節就是IO.
在Linux中,一切皆檔案.實際上要檔案幹啥?不就是讀寫麼?所以,這句話本質就是"IO才是王道".用php的fopen開啟檔案關閉檔案讀讀寫寫,這叫本地檔案IO.在socket程式設計中,本質就是網路IO.
所以,在開始進一步的socket程式設計前,我們必須先從概念上認識好IO.
如果到這裡你還對IO沒啥概念,那麼我就通過幾個詞來給你一個大概的印象:同步,非同步,阻塞,非阻塞,甚至是同步阻塞,同步非阻塞,非同步阻塞,非同步非阻塞.是不是暈了?截至到目前為止,你可以簡單地認為只要搞明白這幾個名詞的含義以及區別,就算弄明白IO了,至少了可以繼續往下看了.
先機械記憶一波兒:IO分為兩大種,同步和非同步.
同步IO:
- 阻塞IO
- 非阻塞IO
- IO多路複用(包括select,poll,epoll三種)
- 訊號驅動IO
非同步IO
那麼如何理解區別這幾個概念呢?尤其是同步和阻塞,非同步和非阻塞,看起來就是一樣的.
我先舉個例子結合自己的理解來說明一下:
- 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,你自己看著點兒!".於是你就站在旁邊只等饅頭.此時的你,是阻塞的,是同步的.阻塞表現在你除了等饅頭,別的什麼都不做了.同步表現在等饅頭的過程中,阿梅不提供通知服務,你不得不自己要等到"饅頭出爐"的訊息.
- 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,你自己看著點兒!".於是你就站在旁邊發微信,然後問一句:"好了沒?",然後發QQ,然後再問一句:"好了沒?".此時的你,是非阻塞的
- 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,蒸好了我打電話告訴你!".但你依然站在旁邊只等饅頭,此時的你,是阻塞的,是非同步的.阻塞表現在你除了等饅頭,別的什麼都不做了.非同步表現在等饅頭的過程中,阿梅提供電話通知"饅頭出爐"的訊息,你只需要等阿梅的電話.
- 你去甜在心饅頭店買太極饅頭,阿梅說:"暫時沒,正在蒸呢,蒸好了我打電話告訴你!".於是你就走了,去買了雙新球鞋,看了看武館,總之,從此不再過問饅頭的事情,一心只等阿梅電話.此時的你,是非阻塞的
如果你仔細品過上面案例中的每一個字,你就能慢慢體會到之所以非同步和非阻塞,同步和阻塞容易混淆,僅僅是因為二者的表現形式稍微有點兒相似而已.
阻塞和非阻塞關注的是:在等饅頭的過程中,你在幹啥.
同步和非同步關注的是:等饅頭這件事,你是一直等到"饅頭出爐"的結果,還是立即跑路等阿梅告訴你的"饅頭出爐".重點的是你是如何得知"饅頭出爐"的.
所以現實世界中,最傻的人才會採用非同步阻塞的IO方式去寫程式.其餘三種方式,更多的人都會選擇同步阻塞或者非同步非阻塞.同步非阻塞最大的問題在於,你需要不斷在各個任務中忙碌著,導致你的大腦混亂,非常累.