SWOOLE編程細節知識

注意事項

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

異步編程

異步程序要求代碼中不得包含任何同步阻塞操作
異步與同步代碼不能混用,一旦應用程序使用了任何同步阻塞的代碼,程序即退化爲同步模式

類/函數重複定義

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

內存管理

PHP守護進程與普通Web程序的變量生命週期、內存管理方式完全不同。請參考 swoole_server內存管理 頁面。編寫swoole_server或其他常駐進程時需要特別注意。

進程隔離

進程隔離也是很多新手經常遇到的問題。修改了全局變量的值,爲什麼不生效,原因就是全局變量在不同的進程,內存空間是隔離的,所以無效。所以使用swoole開發Server程序需要了解進程隔離問題。

不同的進程中PHP變量不是共享,即使是全局變量,在A進程內修改了它的值,在B進程內是無效的
如果需要在不同的Worker進程內共享數據,可以用Redis、MySQL、文件、Swoole\Table、APCu、shmget等工具實現
不同進程的文件句柄是隔離的,所以在A進程創建的Socket連接或打開的文件,在B進程內是無效,即使是將它的fd發送到B進程也是不可用的

發佈了26 篇原創文章 · 獲贊 62 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章