一直想寫(xiě)點(diǎn)Swoole的東西,畢竟它重新定義了php,卻一直不知道怎么下手寫(xiě)
Swoole涉及的知識(shí)點(diǎn)非常多,互為表里,每次想寫(xiě)都發(fā)現(xiàn)根本理不出一個(gè)頭緒
Swoole是一個(gè)php的擴(kuò)展,它的核心目的就是解決php在實(shí)現(xiàn)server服務(wù)中可能遇到的一系列問(wèn)題,這些問(wèn)題用源生的php往往并不能很高效(執(zhí)行效率)的解決,一般也不會(huì)使用php來(lái)解決,所以會(huì)有說(shuō)swolle重新定義的php的說(shuō)法。
畢竟php作為一門(mén)成熟的腳本語(yǔ)言,開(kāi)發(fā)效率是先天優(yōu)勢(shì)。
擴(kuò)展的英文名稱(chēng)是Extension,php擴(kuò)展是用C語(yǔ)言作為開(kāi)發(fā)語(yǔ)言,基于Zend引擎提供的API,編譯成的一個(gè)動(dòng)態(tài)庫(kù)。
如果曾經(jīng)做過(guò)類(lèi)似動(dòng)態(tài)庫(kù)調(diào)用開(kāi)發(fā)的童鞋可能會(huì)更好理解一些,例如Android中的NDK開(kāi)發(fā)
在php的配置文件中配置好extension的屬性后,就可以引用這個(gè)動(dòng)態(tài)庫(kù)了。
也就是說(shuō),swoole本身是用C語(yǔ)言編寫(xiě)的,它可以讓php獲得一些額外的function。
然后是運(yùn)行方式,swoole的許多功能都只能運(yùn)行在cli模式下,而cli模式往往是很多剛接觸swoole的phper遇到的第一個(gè)問(wèn)題。
我當(dāng)初學(xué)習(xí)swoole的時(shí)候也在cli這里栽了個(gè)大跟頭
我們現(xiàn)在整理一下最常見(jiàn)的php代碼執(zhí)行方式:
- 安裝apache、php
- 配置apache對(duì)那個(gè)目錄進(jìn)行php解析
- 用瀏覽器訪(fǎng)問(wèn)那個(gè)目錄的php文件
更多的細(xì)節(jié)這里就不提了,畢竟我相信每個(gè)phper對(duì)這個(gè)都是很熟悉的。
但這里就開(kāi)始出現(xiàn)了第一個(gè)問(wèn)題,我們知道,php是一個(gè)腳本語(yǔ)言,腳本語(yǔ)言的核心特點(diǎn)在于不用編譯,隨時(shí)執(zhí)行,而執(zhí)行腳本的工具就是解析器,而php的解析器就是zend引擎。
嚴(yán)格來(lái)說(shuō),zend并不是唯一的選擇,不過(guò),zend是最官方的。另外,Zend Studio和Zend Engine不是同一個(gè)東西,本文中的Zend全部指Zend Engine。
換個(gè)角度講,只要有解析器,寫(xiě)好的php腳本就是可以執(zhí)行的,而zend引擎與apache之間并沒(méi)有絕對(duì)的關(guān)系
實(shí)際上,apahce是調(diào)用了zend對(duì)php腳本進(jìn)行執(zhí)行,然后將執(zhí)行結(jié)果輸出給了瀏覽器
所以所謂cli模式(CommandLine,命令行模式),其實(shí)就是在命令行下直接調(diào)用zend引擎對(duì)php腳本進(jìn)行解析并執(zhí)行,并獲得程序輸出結(jié)果的php腳本執(zhí)行方式。
其實(shí)php也可以作為shell腳本來(lái)使用哦,就像bash shell一樣
既然問(wèn)題講清楚了,在一個(gè)系統(tǒng)中具體怎么操作呢?
本文以CentOS 7.5作為系統(tǒng)環(huán)境,swoole是針對(duì)linux系統(tǒng)開(kāi)發(fā)的,windows下并不適用。學(xué)習(xí)swoole的一個(gè)前題是懂得基本的linux系統(tǒng)使用。
當(dāng)安裝好php的時(shí)候,找到php的安裝目錄,如果是默認(rèn)安裝的話(huà),可以試試whereis命令
# 某種簡(jiǎn)單的方法
whereis php
> /usr/local/bin/php;
locate whereis find這些命令都可以試試,目的是找到php
然后我們來(lái)寫(xiě)一個(gè)最經(jīng)典的php腳本:
//vi hello_cli.php
<?php
echo 'Hello PHP Cli';
編寫(xiě)純php腳本時(shí),php標(biāo)簽不要封口
然后我們?cè)趕hell里執(zhí)行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
這段代碼中的第一個(gè)php,是一個(gè)可執(zhí)行文件,它接受一個(gè)php腳本文件作為輸入?yún)?shù),并解析執(zhí)行這個(gè)php腳本文件(通過(guò)zend)。
沒(méi)有錯(cuò),第一個(gè)cli模式下的php程序就被你執(zhí)行成功了!
默認(rèn)情況下,php都會(huì)被安裝在了$PATH的目錄下,那就可以直接省略路徑前綴了,下文中調(diào)用php的時(shí)候,全都省略了路徑前綴。
因?yàn)閟woole是pecl的項(xiàng)目,所以使用pecl安裝是最簡(jiǎn)單的方法,強(qiáng)烈推薦第一次接觸的童鞋先使用pecl安裝,在熟悉了swoole之后,再考慮使用編譯安裝的方式以獲取更多進(jìn)階功能。
pecl這個(gè)工具基本都會(huì)被安裝在與php相同的目錄下(往往也都是$PATH目錄)
pecl install swoole
執(zhí)行以下命令查看是否安裝成功:
php -m | grep swoole
> swoole
如果正確的輸出了swoole,那么恭喜你,這次安裝很成功
另一個(gè)常見(jiàn)的比較麻煩的問(wèn)題是,有些童鞋的電腦里安裝了多個(gè)php,而安裝的時(shí)候沒(méi)有正確的安裝到預(yù)期的php的擴(kuò)展目錄中,就會(huì)導(dǎo)致無(wú)法正常工作,解決方案就是弄清楚各個(gè)php安裝目錄及配置關(guān)系,選擇正確的目錄進(jìn)行安裝。
其實(shí)本文還沒(méi)正式開(kāi)始介紹swoole,都是在學(xué)習(xí)swoole之前的準(zhǔn)備工作,swoole的上手門(mén)檻比一般的php應(yīng)用要高的多,如果沒(méi)有網(wǎng)絡(luò)開(kāi)發(fā)和操作系統(tǒng)方面的一些知識(shí),學(xué)習(xí)它并不是一件容易的事情,學(xué)習(xí)曲線(xiàn)很陡峭。
這句話(huà)我在群里說(shuō)了無(wú)數(shù)次
很多新手會(huì)詬病swoole的手冊(cè)寫(xiě)的太模糊,其實(shí)是前置知識(shí)不足,而手冊(cè)也給出了需要的前置知識(shí)列表,以下引用至官網(wǎng)的手冊(cè)-學(xué)習(xí)swoole需要哪些知識(shí)?
多進(jìn)程/多線(xiàn)程
- 了解Linux操作系統(tǒng)進(jìn)程和線(xiàn)程的概念
- 了解Linux進(jìn)程/線(xiàn)程切換調(diào)度的基本知識(shí)
- 了解進(jìn)程間通信的基本知識(shí),如管道、UnixSocket、消息隊(duì)列、共享內(nèi)存
socket
- 了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind
- 了解SOCKET的接收緩存區(qū)、發(fā)送緩存區(qū)、阻塞/非阻塞、超時(shí)等概念
IO復(fù)用
- 了解select/poll/epoll
- 了解基于select/epoll實(shí)現(xiàn)的事件循環(huán),Reactor模型
- 了解可讀事件、可寫(xiě)事件
TCP/IP網(wǎng)絡(luò)協(xié)議
- 了解TCP/IP協(xié)議
- 了解TCP、UDP傳輸協(xié)議
調(diào)試工具
- 使用gdb調(diào)試Linux程序
- 使用strace跟蹤進(jìn)程的系統(tǒng)調(diào)用
- 使用tcpdump跟蹤網(wǎng)絡(luò)通信過(guò)程
- 其他Linux系統(tǒng)工具,如ps、lsof、top、vmstat、netstat、sar、ss等
學(xué)習(xí)并理解一個(gè)新事務(wù)并不是一個(gè)容易的事情,特別對(duì)于swoole這種具備一定顛覆性的工具,要有耐心和實(shí)踐。
淡定的把手冊(cè)看完,遇到不理解的名字學(xué)會(huì)使用搜索引擎學(xué)習(xí),swoole的手冊(cè)其實(shí)是個(gè)大寶庫(kù),網(wǎng)絡(luò)開(kāi)發(fā)常見(jiàn)的問(wèn)題其實(shí)里邊都涉及到了。