## Swoole
php代碼只是個表現形式,程序最終是運行在內存中的進程,內存中一種東西,代碼只是一種形式而已。
代碼只是一個形式,以一種方式來創建一個運行在內存中的程序,所以Swoole的php腳本代碼只是啟動進程的方式而已,這個php腳本只是這種啟動方式的載體而已(所以理論上不使用php代碼,使用任何代碼都可以,使用php只是因為Swoole本身就是php的擴展,用php代碼來啟動更親切,更加的方便而已),運行后你再刪掉腳本文件都沒關系,因為代碼只是形式,只是為了啟動進程而已。
這么來看,任何程序的代碼都是這樣的,比如PHP腳本,你寫了它,只是一種形式而已,運行時它被加載到內存了,此時你可以刪除它都沒問題的,內存中的程序不會受影響,你寫的代碼只是描述了如何生成內存中的程序而已,所以你要明白,你寫的代碼只是一種形式的體驗而已,最終運行的是加載到內存中的程序。
>[danger] 站在這個角度考慮,那么編程語言是不存在的,萬物是不存在的,不過不要想太多,而成為[民間哲學家](https://segmentfault.com/q/1010000009586182)。
傳統web只是每次都需要調用腳本創建進程,而Swoole一般只是常駐服務,所以會更明顯的體會到這點。
* * * * *
### 代碼的本質
對計算機來說,代碼本身并不重要,對人來說,代碼怎么寫才重要(所以規范很重要)。
對計算機來說,代碼只是工作指令。對人來說,代碼是解決問題的邏輯思維。
代碼中應當有你的思考,思想,代碼是有靈魂的,好的代碼優雅簡潔,是能從中發現真善美的。
計算機只是工具,代碼是我們與工具打交道的方式。
* * * * *
### 參考
**php的運行模式和生命周期**
[Laravel的核心概念 - SegmentFault](https://segmentfault.com/p/1210000007162144)
[為什么Swoole可以加速php - daryl的技術天地 - SegmentFault](https://segmentfault.com/a/1190000009486485)
* * * * *
[關于PHP協程與阻塞的思考](http://mp.weixin.qq.com/s/WxcP_ghWyY3kWoPi_8dC8w)
* * * * *
[談編程 · php筆記 · 看云](http://www.hmoore.net/xiak/php-node/500811)
[Golang在php的web開發中,可以替代哪些應用場景? - 知乎](https://www.zhihu.com/question/265388870/answer/293319812)
> **【短生命周期+同步】** 的PHP-FPM 和 **【長生命周期(邏輯內存常駐)+同步/異步】** 的Swoole聯合開發.
[Just for fun——Slim借力Swoole - Salamander - SegmentFault](https://segmentfault.com/a/1190000013070940)
[workerman / 小談PHP中的幾種運行模式 - 掘金](https://juejin.im/post/5ac70b11f265da239e4e5132)
[ThinkPhp5與Swoole定時任務實踐 · 看云](http://www.hmoore.net/dapeng235/thinkphp5_swoole_timer)
* * * * *
> **理論上其他的同步阻塞 PHP 框架,如 Laravel 、Yii **,都可以實現只修改底層兼容 Swoole 2.x 協程,實現項目代碼無縫切換協程模式。拭目以待。by:[韓天峰-Rango的微博_微博](https://weibo.com/hantianfeng?refer_flag=1005055014_&is_hot=1#1523957726058)
* * * * *

> 又搞定一個新特性,在 Swoole 協程中**死循環向某個連接發送數據**,會導致緩存區塞滿。之前的處理邏輯,為了避免服務器內存吃光,超過內存緩存區后會立即返回 false 。現在用協程實現了自動調度,緩存區滿的時候自動 yield,發送完成后自動 resume 協程繼續發送。

> Swoole 的協程編程體驗非常棒。不需要多線程,直接用 go 關鍵詞開協程并發執行。
* * * * *
[matyhtf/framework: PHP advanced Web development framework. The built-in application server based on the development of swoole extension.](https://github.com/matyhtf/framework)
> #### SwooleFramework: PHP的高級開發框架
>
> 與其他Web框架不同,SwooleFramework是一個全功能的后端服務器框架。除了Web方面的應用之外,更廣泛的后端程序中都可以使用。
>
> * 內置PHP應用服務器,可脫離nginx/php-fpm/apache獨立運行
> * 配置化與資源自動工廠,可實現從配置中創建資源對象,完全無需new對象
> * 全面采用命名空間+autoload,代碼中無需任何的include/require
> * 全局注冊樹,所有資源都掛載到全局樹上,徹底實現資源的單例管理和懶加載
> * 全棧框架,提供了數據庫操作,模板,Cache,日志,隊列,上傳管理,用戶管理等幾乎所有的功能
>
> PHP版本需求: PHP5.4/PHP5.5/PHP5.6/PHP7.0/PHP7.1,不支持PHP5.3
#### [Swoole框架](https://wiki.swoole.com/wiki/index/prid-2)
基于Swoole擴展開發的PHP web server&應用服務器, 內置框架。提供統一注冊樹,數據庫操作,模板,Cache,日志,隊列,上傳管理,用戶管理等豐富的功能特性。
swoole框架相比apache/fpm,主要是節省PHP框架和全局對象每次請求創建銷毀帶來的性能損耗。如果你的PHP代碼是裸echo的方式,swoole框架并沒有性能優勢。
swoole框架給程序員提供了最大的空間,與http請求無關的全局對象只需要構造一次。程序中還可以對某些對象和數據進行緩存控制。
* * * * *
[mixstart/mixphp: 輕量 PHP 框架,基于 Swoole 的常駐內存型 PHP 高性能框架 (開發文檔完善)](https://github.com/mixstart/mixphp)
> #### 與傳統 MVC 框架比較
>
> MixPHP 與傳統 PHP 的 Web 框架非常不同,可以不需要 Web 服務器(Apache/PHP-FPM),框架自帶基于 SwooleServer 開發的 mix-httpd 高性能 HTTP 服務器,**傳統的 PHP 應用程序中腳本結束后,所有的對象在請求后都將銷毀,而 mix-httpd 不同,框架組件對象常駐于內存,減少對象反復創建銷毀的性能損失,具有傳統框架無法比擬的性能優勢。**
>
> MixPHP 參考了 Yii2 框架的組件設計思想,又舍棄了 Yii2 與前端強耦合的缺點,使得整個框架如同 CodeIgniter 一樣小巧別致,MixPHP 同時擁有 Yii2 的架構思想、Swoole 的高性能與更后端開發能力。
[easy-swoole/easyswoole: use swoole easily just like echo "hello world";](https://github.com/easy-swoole/easyswoole)
> EasySwoole 是一款基于Swoole Server 開發的常駐內存型的分布式PHP框架,專為API而生,擺脫傳統PHP運行模式在進程喚起和文件加載上帶來的性能損失。EasySwoole 高度封裝了 Swoole Server 而依舊維持 Swoole Server 原有特性,支持同時混合監聽HTTP、自定義TCP、UDP協議,讓開發者以最低的學習成本和精力編寫出多進程,可異步,高可用的應用服務
[為什么 PHP 程序員應該學習使用 Swoole](https://www.toutiao.com/a6568284224787317251/?tt_from=weixin&utm_campaign=client_share×tamp=1529319824&app=news_article_lite&utm_source=weixin&iid=33124962994&utm_medium=toutiao_android&wxshare_count=1)
> 【常駐內存】目前傳統 PHP框架,在處理每個請求之前,都要做一遍加載框架文件、配置的操作。這可能已經成為性能問題的一大原因,而使用 Swoole 則沒有這個問題,一次加載多次使用。
[top-think/think-swoole at 2.0](https://github.com/top-think/think-swoole/tree/2.0)(這樣的東西肯定用擴展去做,而不是寫在框架里面)
* * * * *
[ThinkPHP 5.1 Swoole 快速上手指南 · ThinkPHP5.1 Swoole上手指南 · 看云](http://www.hmoore.net/thinkphp/think-swoole/content)
[easySwoole|swoole框架|swoole拓展|swoole](https://www.easyswoole.com/)
我也是用swoole框架,感覺確實快..響應都是在100ms內..代碼多注意點就是,畢竟自己管理內存,進程..
用于線上項目的話,內存泄露,mysql斷線,服務崩了也只能重啟,畢竟不能用die的,調試全部是var_dump,sleep函數也要慎用,全局變量自己要記得銷毀.其他的多注意點就是
[聽過PHP定時器嗎?](https://mp.weixin.qq.com/s/TV8Qe0kvTCasz6mDIIA92w)
[swoolefy](https://github.com/bingcool/swoolefy)(swoolefy是一個基于swoole實現的輕量級、高性能、協程級、開放性的API應用服務框架)
[PHP 不會死 —— 我們如何使用 Golang 來阻止 PHP 走向衰亡](https://mp.weixin.qq.com/s/x1QSy6NxlLE_Yv9wX6et2Q)
[來,控制一下 Goroutine 的并發數量](https://mp.weixin.qq.com/s/LyBp8D4ri32Yv2vTwpb3xA)
[https://www.easyswoole.com/Manual/3.x/Cn/_book/noobCourse/Coroutine.html](https://www.easyswoole.com/Manual/3.x/Cn/_book/noobCourse/Coroutine.html)
[nginx、swoole高并發原理初探](https://mp.weixin.qq.com/s/_gR3hXWnzTqM87ThVYeCww)
* * * * *
[goproxy/README_ZH.md at master · snail007/goproxy](https://github.com/snail007/goproxy/blob/master/README_ZH.md)
> 程序內部能設置信號處理方式,實現后臺運行。
>
> 守護運行不是后臺運行的意義,而是有另一個監控進程,監控著目標進程的運行情況,以保證目標進程的運行,相當于是守護的意思。
#### 后臺運行
默認執行proxy之后,如果要保持proxy運行,不能關閉命令行.
如果想在后臺運行proxy,命令行可以關閉,只需要在命令最后加上--daemon參數即可.
比如:
`./proxy http -t tcp -p "0.0.0.0:38080" --daemon`
#### 守護運行
守護運行參數--forever,比如:?`proxy http --forever`?,
proxy會fork子進程,然后監控子進程,如果子進程異常退出,5秒后重啟子進程.
該參數配合后臺運行參數--daemon和日志參數--log,可以保障proxy一直在后臺執行不會因為意外退出,
而且可以通過日志文件看到proxy的輸出日志內容.
比如:?`proxy http -p ":9090" --forever --log proxy.log --daemon`
* * * * *
last update:2018-2-2 15:13:24
- 開始
- 公益
- 更好的使用看云
- 推薦書單
- 優秀資源整理
- 技術文章寫作規范
- SublimeText - 編碼利器
- PSR-0/PSR-4命名標準
- php的多進程實驗分析
- 高級PHP
- 進程
- 信號
- 事件
- IO模型
- 同步、異步
- socket
- Swoole
- PHP擴展
- Composer
- easyswoole
- php多線程
- 守護程序
- 文件鎖
- s-socket
- aphp
- 隊列&并發
- 隊列
- 講個故事
- 如何最大效率的問題
- 訪問式的web服務(一)
- 訪問式的web服務(二)
- 請求
- 瀏覽器訪問阻塞問題
- Swoole
- 你必須理解的計算機核心概念 - 碼農翻身
- CPU阿甘 - 碼農翻身
- 異步通知,那我要怎么通知你啊?
- 實時操作系統
- 深入實時 Linux
- Redis 實現隊列
- redis與隊列
- 定時-時鐘-阻塞
- 計算機的生命
- 多進程/多線程
- 進程通信
- 拜占庭將軍問題深入探討
- JAVA CAS原理深度分析
- 隊列的思考
- 走進并發的世界
- 鎖
- 事務筆記
- 并發問題帶來的后果
- 為什么說樂觀鎖是安全的
- 內存鎖與內存事務 - 劉小兵2014
- 加鎖還是不加鎖,這是一個問題 - 碼農翻身
- 編程世界的那把鎖 - 碼農翻身
- 如何保證萬無一失
- 傳統事務與柔性事務
- 大白話搞懂什么是同步/異步/阻塞/非阻塞
- redis實現鎖
- 淺談mysql事務
- PHP異常
- php錯誤
- 文件加載
- 路由與偽靜態
- URL模式之分析
- 字符串處理
- 正則表達式
- 數組合并與+
- 文件上傳
- 常用驗證與過濾
- 記錄
- 趣圖
- foreach需要注意的問題
- Discuz!筆記
- 程序設計思維
- 抽象與具體
- 配置
- 關于如何學習的思考
- 編程思維
- 談編程
- 如何安全的修改對象
- 臨時
- 臨時筆記
- 透過問題看本質
- 程序后門
- 邊界檢查
- session
- 安全
- 王垠
- 第三方數據接口
- 驗證碼問題
- 還是少不了虛擬機
- 程序員如何談戀愛
- 程序員為什么要一直改BUG,為什么不能一次性把代碼寫好?
- 碎碎念
- 算法
- 實用代碼
- 相對私密與絕對私密
- 學習目標
- 隨記
- 編程小知識
- foo
- 落盤
- URL編碼的思考
- 字符編碼
- Elasticsearch
- TCP-IP協議
- 碎碎念2
- Grafana
- EFK、ELK
- RPC
- 依賴注入
- 開發筆記
- 經緯度格式轉換
- php時區問題
- 解決本地開發時調用遠程AIP跨域問題
- 后期靜態綁定
- 談tp的跳轉提示頁面
- 無限分類問題
- 生成微縮圖
- MVC名詞
- MVC架構
- 也許模塊不是唯一的答案
- 哈希算法
- 開發后臺
- 軟件設計架構
- mysql表字段設計
- 上傳表如何設計
- 二開心得
- awesomes-tables
- 安全的代碼部署
- 微信開發筆記
- 賬戶授權相關
- 小程序獲取是否關注其公眾號
- 支付相關
- 提交訂單
- 微信支付筆記
- 支付接口筆記
- 支付中心開發
- 下單與支付
- 支付流程設計
- 訂單與支付設計
- 敏感操作驗證
- 排序設計
- 代碼的運行環境
- 搜索關鍵字的顯示處理
- 接口異步更新ip信息
- 圖片處理
- 項目搭建
- 閱讀文檔的新方式
- mysql_insert_id并發問題思考
- 行鎖注意事項
- 細節注意
- 如何處理用戶的輸入
- 不可見的字符
- 抽獎
- 時間處理
- 應用開發實戰
- python 學習記錄
- Scrapy 教程
- Playwright 教程
- stealth.min.js
- Selenium 教程
- requests 教程
- pyautogui 教程
- Flask 教程
- PyInstaller 教程
- 蜘蛛
- python 文檔相似度驗證
- thinkphp5.0數據庫與模型的研究
- workerman進程管理
- workerman網絡分析
- java學習記錄
- docker
- 筆記
- kubernetes
- Kubernetes
- PaddlePaddle
- composer
- oneinstack
- 人工智能 AI
- 京東
- pc_detailpage_wareBusiness
- doc
- 電商網站設計
- iwebshop
- 商品規格分析
- 商品屬性分析
- tpshop
- 商品規格分析
- 商品屬性分析
- 電商表設計
- 設計記錄
- 優惠券
- 生成唯一訂單號
- 購物車技術
- 分類與類型
- 微信登錄與綁定
- 京東到家庫存系統架構設計
- crmeb
- 命名規范
- Nginx https配置
- 關于人工智能
- 從人的思考方式到二叉樹
- 架構
- 今日有感
- 文章保存
- 安全背后: 瀏覽器是如何校驗證書的
- 避不開的分布式事務
- devops自動化運維、部署、測試的最后一公里 —— ApiFox 云時代的接口管理工具
- 找到自己今生要做的事
- 自動化生活
- 開源與漿果
- Apifox: API 接口自動化測試指南