php如何解决脏读,php 技术沉淀
一、cgi/fast-cgi/php-fpm
1. cgi
cgi,通用網關協議,它在職責、通信方式、實現要求和安全性上,對 server 和 cgi 程序進行了規范,使得很多語言能在滿足 cgi 協議的前提下,和 server 分工合作,實現 web 開發。但 cgi 協議缺少對「server 如何執行 cgi 程序」的規范,使得 cgi 模式下,還停留在 fork-execute-destroy 的模式下,性能抵消。
2. fast-cgi
fast-cgi 主要在「cgi執行方式」和「cgi功能角色」兩方面進行了優化。它讓 server 和 cgi 以 socket 通信的方式,使得 server 和 cgi 能夠單獨部署。同時,fast-cgi 協議下,cgi 程序不再是單出的 responser 的角色,還有 authenticate 和 filter 的功能。
3. php-cgi
php-cgi 是 fast-cgi 的一個 php 實現。
4. php-fpm
php-fpm 是 php-cgi 的一個進程管理模型,它以父子進程的方式,讓父進程負責:與server通信、加載配置、管理子進程,子進程搶占式獲取cgi請求后,負責執行cgi程序獲得結果,并返回給父進程。同時,php-fpm提供了平滑終止、平滑啟動等進程管理方式。
5. php-fpm 如何平滑終止、平滑重啟?
kill -USR2 平滑重啟。
kill -INI 平滑終止。
6. nginx 內部執行流程
從 cig 協議上看,server 工作流程:接受客戶端 http 請求 -> 選擇 cgi 程序處理此請求 -> 將 http 請求轉化成 cgi 請求 -> 執行 cgi 程序 -> 得到 cgi 結果響應客戶端。
7. nginx 和 php-fpm 通信方式
因為 fast-cgi 中規范了 server 和 cgi 以 socket 方式通信,單獨部署。因此,根據 socket 域不同,分為 xxx.sock 本地域和 ip:port 的網絡域。在 nginx 中,網絡域下直接 upstream 的方式,負載均衡。
8. php-fpm 進程管理方式及適用場景。
static 靜態。啟動固定數量個子進程。沒有頻繁的進程新建和銷毀,適合內存、CPU配置高的機器。進程數量=內存/30MB。
dynamic 動態。進程數量在 min/max/idle 間動態調整。適合配置低的機器,能夠有效利用硬件性能。
按需。需要多少啟動多少。不適合并發突增的業務場景,很少使用。
MySQL
1. 事務問題
臟讀:B事務讀到了A事務未提交的數據。
不可重復度:事務A在事務B提交前后,兩次讀取到的數據不一致。
幻讀:事務A更新成功后,事務B修改或新增提交后,事務A發現「沒有全部更新成功」
2. 事務級別
讀未提交:存在臟讀、不可重復讀、幻讀;基本不用;
讀已提交:存在不可重復度、幻讀;
可重復讀:存在幻讀;
串行化:順序執行,效率低;
3. MySQL鎖
鎖性質:共享鎖 & 排它鎖
鎖粒度:行鎖 & 表鎖
加鎖方式:悲觀鎖 & 樂觀鎖
鎖類型:意向鎖 & 行鎖 & 表鎖 & 間隙鎖
4. MySQL的RR如何解決幻讀?
InnoDB 組合使用行鎖Record Lock和間隙鎖Gap Lock將:索引中,本記錄和本記錄兩側值鎖定了,無法更新和插入,所以沒有幻讀問題。
5. 悲觀鎖 & 樂觀鎖
悲觀鎖,認為別人修改他需要的數據的幾率很高,所以一開始就鎖住他需要的數據,避免別人更新。如:select * from xxx where account='123456' for update。直到它處理完提交事務后才釋放。
悲觀鎖,并發性能不好,降低吞吐量。
樂觀鎖,認為別人修改他需要的數據的幾率很低,直到準備提交所做的修改到數據庫的時候才會將數據鎖住,判斷在取數據和更新數據期間是否有人修改過這個數據,因此會存在不可重復讀、幻讀等問題。
樂觀鎖,加鎖時間短,性能好。
總結
以上是生活随笔為你收集整理的php如何解决脏读,php 技术沉淀的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 主力洗盘结束四个征兆?
- 下一篇: QQ如何加禁止加好友的人(QQ官方下载)