日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

easyswoole学习笔记

發布時間:2023/12/29 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 easyswoole学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

?

1,常規安裝,根據文檔檢查環境要求

  • 保證?PHP?版本大于等于?7.1

  • 保證?Swoole?拓展版本大于等于?4.3.0

  • 需要?pcntl?拓展的任意版本

  • 使用?Linux?/?FreeBSD?/?MacOS?這三類操作系統

  • 使用?Composer?作為依賴管理工具

2,采用composer安裝

切換阿里云鏡像

composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/

composer安裝

composer require easyswoole/easyswoole=3.x php vendor/bin/easyswoole install

如果其中報錯,不能用管理員安裝,切換為普通用戶安裝完成,并且暫時修改目錄權限為可寫就好

chmod 755 ./composer.json chmod 755 ./composer.lock

啟動框架代碼

php easyswoole start

composer 安裝報錯?

Failed to decode response: zlib_decode(): data error

? ?網上查? 運用這個命令 composer diagnose,再次安裝依然報錯

??composer self-update 還是不行??

??

? ?執行命令? composer dump-autoload

? 執行命令? ?composer update命令更新依賴? 執行成功

3,本地環境無法訪問9501端口 ,明顯swoole已經在服務器啟動

開始以為是防火墻的問題,于是想現在打開防火墻端口號看看,結果還是不行

iptables -A INPUT -ptcp --dport 端口號-j ACCEPT? ?service iptables save

看了官方文檔介紹:

我以為訪問的是 localhost:9501 ,結果是要以虛擬機的地址來訪問

192.168.xx.xx:9501來進行訪問

linux渣渣,命途多舛............

?

4,啟動停止

php easyswoole

守護模式

php easyswoole start d php easyswoole reload 只重啟task進程 php easyswoole reload all 重啟task + worker進程

5,反向代理模式

由于 Swoole Server 對 HTTP 協議的支持并不完整,建議僅將 EasySwoole 作為后端服務,并且在前端增加 NGINX 或 APACHE 作為代理,參照下面的例子添加轉發規則

ngiinx

server {root /data/wwwroot/;server_name local.swoole.com;location / {proxy_http_version 1.1;proxy_set_header Connection "keep-alive";proxy_set_header X-Real-IP $remote_addr;if (!-f $request_filename) {proxy_pass http://127.0.0.1:9501;}} }

代理之后,可通過$request->getHeader('x-real-ip')[0]獲取客戶端真實ip

apache

<IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f #RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L] fcgi下無效 RewriteRule ^(.*)$ http://127.0.0.1:9501/$1 [QSA,P,L] #請開啟 proxy_mod proxy_http_mod request_mod </IfModule>

?

6,開發者必讀??看完了官方文檔,就抄寫了一堆文檔注意事項在這

注意事項

  • 不要在代碼中執行sleep以及其他睡眠函數,這樣會導致整個進程阻塞 exit/die是危險的,會導致worker進程退出
  • 可通過register_shutdown_function來捕獲致命錯誤,在進程異常退出時做一些請求工作。
  • PHP代碼中如果有異常拋出,必須在回調函數中進行try/catch捕獲異常,否則會導致工作進程退出
  • swoole不支持set_exception_handler,必須使用try/catch方式處理異常
  • Worker進程不得共用同一個Redis或MySQL等網絡服務客戶端,Redis/MySQL創建連接的相關代碼可以放到onWorkerStart回調函數中。

類/函數重復定義

  • 新手非常容易犯這個錯誤,由于easySwoole是常駐內存的,所以加載類/函數定義的文件后不會釋放。因此引入類/函數的php文件時必須要使用include_once或require_once,否會發生cannot redeclare function/class 的致命錯誤。

進程隔離與內存管理

  • 進程隔離也是很多新手經常遇到的問題。修改了全局變量的值,為什么不生效,原因就是全局變量在不同的進程,內存空間是隔離的,所以無效。 所以使用easySwoole開發Server程序需要了解進程隔離問題。不同的進程中PHP變量不是共享,即使是全局變量,在A進程內修改了它的值,在B進程內是無效的,如果需要在不同的Worker進程內共享數據,可以用Redis、MySQL、文件、Swoole\Table、APCu、shmget等工具實現 還有,不同進程的文件句柄是隔離的,所以在A進程創建的Socket連接或打開的文件,在B進程內是無效,即使是將它的fd發送到B進程也是不可用的。

  • 進程克隆。在Server啟動時,主進程會克隆當前進程狀態,此后開始進程內數據相互獨立,互不影響。有疑問的新手可以先弄懂php的pcntl

swoole_server中對象的4層生命周期

開發swoole程序與普通LAMP下編程有本質區別。在傳統的Web編程中,PHP程序員只需要關注request到達,request結束即可。而在swoole程序中程序員可以操控更大范圍,變量/對象可以有四種生存周期。

變量、對象、資源、require/include的文件等下面統稱為對象

程序全局期

在swoole_server->start之前就創建好的對象,我們稱之為程序全局生命周期。這些變量在程序啟動后就會一直存在,直到整個程序結束運行才會銷毀。

有一些服務器程序可能會連續運行數月甚至數年才會關閉/重啟,那么程序全局期的對象在這段時間持續駐留在內存中的。程序全局對象所占用的內存是Worker進程間共享的,不會額外占用內存。

這部分內存會在寫時分離(COW),在Worker進程內對這些對象進行寫操作時,會自動從共享內存中分離,變為進程全局對象。

程序全局期include/require的代碼,必須在整個程序shutdown時才會釋放,reload無效

進程全局期

swoole擁有進程生命周期控制的機制,一個Worker子進程處理的請求數超過max_request配置后,就會自動銷毀。Worker進程啟動后創建的對象(onWorkerStart中創建的對象),在這個子進程存活周期之內,是常駐內存的。onConnect/onReceive/onClose 中都可以去訪問它。

進程全局對象所占用的內存是在當前子進程內存堆的,并非共享內存。對此對象的修改僅在當前Worker進程中有效 進程期include/require的文件,在reload后就會重新加載

會話期

會話期是在onConnect后創建,或者在第一次onReceive時創建,onClose時銷毀。一個客戶端連接進入后,創建的對象會常駐內存,直到此客戶端離開才會銷毀。

在LAMP中,一個客戶端瀏覽器訪問多次網站,就可以理解為會話期。但傳統PHP程序,并不能感知到。只有單次訪問時使用session_start,訪問$_SESSION全局變量才能得到會話期的一些信息。

swoole中會話期的對象直接是常駐內存,不需要session_start之類操作。可以直接訪問對象,并執行對象的方法。

?

請求期

請求期就是指一個完整的請求發來,也就是onReceive收到請求開始處理,直到返回結果發送response。這個周期所創建的對象,會在請求完成后銷毀。

swoole中請求期對象與普通PHP程序中的對象就是一樣的。請求到來時創建,請求結束后銷毀。

?

swoole_server中內存管理機制

swoole_server啟動后內存管理的底層原理與普通php-cli程序一致。具體請參考Zend VM內存管理方面的文章。

?

局部變量

在事件回調函數返回后,所有局部對象和變量會全部回收,不需要unset。如果變量是一個資源類型,那么對應的資源也會被PHP底層釋放。

function test() {$a = new Object;$b = fopen('/data/t.log', 'r+');$c = new swoole_client(SWOOLE_SYNC);$d = new swoole_client(SWOOLE_SYNC);global $e;$e['client'] = $d; }

$a, $b, $c 都是局部變量,當此函數return時,這3個變量會立即釋放,對應的內存會立即釋放,打開的IO資源文件句柄會立即關閉。 $d 也是局部變量,但是return前將它保存到了全局變量$e,所以不會釋放。當執行unset($e['client'])時,并且沒有任何其他PHP變量仍然在引用$d變量,那么$d 就會被釋放。

?

全局變量

在PHP中,有3類全局變量。

  • 使用global關鍵詞聲明的變量
  • 使用static關鍵詞聲明的類靜態變量、函數靜態變量
  • PHP的超全局變量,包括$_GET、$_POST、$GLOBALS等

全局變量和對象,類靜態變量,保存在swoole_server對象上的變量不會被釋放。需要程序員自行處理這些變量和對象的銷毀工作。

class Test {static $array = array();static $string = ''; }function onReceive($serv, $fd, $reactorId, $data) {Test::$array[] = $fd;Test::$string .= $data; }
  • 在事件回調函數中需要特別注意非局部變量的array類型值,某些操作如 TestClass::$array[] = "string" 可能會造成內存泄漏,嚴重時可能發生爆內存,必要時應當注意清理大數組。
  • 在事件回調函數中,非局部變量的字符串進行拼接操作是必須小心內存泄漏,如 TestClass::$string .= $data,可能會有內存泄漏,嚴重時可能發生爆內存。

解決方法

  • 同步阻塞并且請求響應式無狀態的Server程序可以設置max_request,當Worker進程/Task進程結束運行時或達到任務上限后進程自動退出。該進程的所有變量/對象/資源均會被釋放回收。
  • 程序內在onClose或設置定時器及時使用unset清理變量,回收資源

?

?

?

總結

以上是生活随笔為你收集整理的easyswoole学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。