A. php-fpm這個事幹嘛用的為什麼要開啟
PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)是一個PHPFastCGI管理器,對於PHP 5.3.3之前的php來說,是一個補丁包 ,旨在將FastCGI進程管理整合進PHP包中。如果你使用的是PHP5.3.3之前的PHP的話,就必須將它patch到你的PHP源代碼中,在編譯安裝PHP後才可以使用。
相對Spawn-FCGI,PHP-FPM在CPU和內存方面的控制都更勝一籌,而且前者很容易崩潰,必須用crontab進行監控,而PHP-FPM則沒有這種煩惱。
B. 如何啟動brew的php-fpm
Nginx是個輕量級的HTTP server,必須藉助第三方的FastCGI處理器才可以對PHP進行解析,PHP-FPM也是一個第三方的FastCGI進程管理器。
linux中啟動
service php-fpm start 啟動
service php-fpm restart 重啟
C. 如何修改mac默認php
最好所有的包都給brew管理,which php查看當前使用的php的路徑,對於使用哪個php,系統會根據PATH的順序自動查找,先找到誰就用誰。所以可以更改PATH里的順序,或者把系統自帶的重命名為其他的
D. mac中怎樣通過brew 安裝php的redis擴展
1、下載php-redis;
2、下載完後進行解壓,然後移動到系統自帶php的同級目錄;①
cp /Users/panxu/Desktop/phpredis /etc
3、進入phpredis;
cd /etc/phpredis
4、動態安裝php擴展模塊;②
/usr/bin/phpize
5、進行編譯;
./configure --with-php-config=/usr/bin/php-config
6、開始安裝;
make && make install
安裝完成,如果成功,會有如下提示:
Build complete.
Don't forget to run 'make test'.
Installing shared extensions: /usr/lib/php/extensions/no-debug-non-zts-20160303/
7、找到php.ini文件,並進行編輯;③
vi php.ini
在配置文件最後一行加入:
extension=redis.so
8、重啟php-fpm,完成安裝。④
步驟中的涉及到的資源和詳細解釋請參考:https://panxu.net/article/8400.html
E. mac配置php-fpm,nginx運行多版本php
1、brew 安裝 php5.6 php5.7 nginx
2、配置php-conf
3、配置虛擬主機
安裝好brew
用brew 命令安裝,如果速度太慢或訪問不了,自行goole brew 換源
brew search php 查看可用的php版本
brew install [email protected] 安裝php5.6
brew install [email protected] 安裝php5.6
brew install nginx 安裝nginx
1、修改php5.6 php-fpm的埠為9056
cd usr/local/etc/php/5.6 # 到php5.6的目錄下
vi php-fpm.conf # 修改文件
listen = 127.0.0.1:9056 # 修改此埠
daemonize = yes # 修改為允許後台啟動php-fpm
2、修改php5.6 php-fpm的埠為9070
cd /usr/local/etc/php/7.1/php-fpm.d # 到php7.1的目錄下
vi www.conf # 修改埠
listen = 127.0.0.1:9056 # 修改此埠
vi php-fpm.conf # 修改文件
daemonize = yes # 修改為允許後台啟動php-fpm
3、啟動php-fpm
cd /usr/local/sbin # 到此目錄,建立兩個軟鏈接指向不同版本的php
切換到root用戶
./php-fpm56
./php-fpm71
啟動後可看到php-fpm的進程,則成功
ps-ef | grep php-fpm
cd /usr/local/etc/nginx/ # 到nginx的目錄下
復制默認的配置文件到server下(此目錄用來存虛擬主機文件)
這里我在server創建了這兩個
vi local.phpinfo56.com.conf # 修改本地域名和nginx代理到php-fpm埠,按照這種方法修改另一個
nginx # 啟動nginx
nginx -s reload # 修改配置文件,重新載入nginx
vi /etc /hosts # 修改host 加上映射關系
cd /usr /local/var/www # 在此目錄下建立一個index.php
echo "<?php phpinfo();" > index.php
在瀏覽器訪問可看到
F. 了解PHP-FPM
在伺服器上,當我們查看php進程時,全都是php-fpm進程,大家都知道這個就是php的運行環境,那麼,它到底是個什麼東西呢?
PHP-FPM,就是PHP的FastCGI管理器,用於替換PHP FastCGI的大部分附加功能,在PHP5.3.3後已經成為了PHP的標配。
有小夥伴要問了,FastCGI又是什麼鬼?CGI程序又叫做「通用網關介面」,就是讓Web伺服器和你的應用程序進行交互的一個介面。就像nginx中需要配置的fastcgi_pass,一般我們會使用127.0.0.1:9000或者unix:/tmp/php-cgi.sock來配置這個參數。它的意思就是告訴nginx,過來的請求使用tcp:9000埠的監聽程序來處理或者使用unix/socket來處理。它們都是指向的PHP運行程序。
再說得通俗一點,我們運行php腳本用的是
php-fpm就相當於是這個php命令。nginx通過fastcgi_pass來運行php $nginx_root(nginx配置文件中網站根目錄root配置)下的index.php。所以,如果你用的是python或者其他什麼語言,都可以用它們的cgi程序來讓nginx調用。
FastCGI和CGI又有什麼不同呢?FastCGI是啟動一個socket介面,伺服器應用不需要自己去運行php,只需要向這個socket介面提交請求就可以了。
php-fpm在編譯php時需要添加--enable-fpm。一些通用的集成安裝包如lnmp、phpStudy等都會默認編譯並使用php-fpm,畢竟是標配。
上文中說過nginx可以使用127.0.0.1:9000和unix:/tmp/php-cgi.sock這兩種方式來調用php-fpm。它們有什麼區別呢?
前者,一般帶9000埠號的,是tcp形式的調用。也就是php-fpm啟動了一個監聽進程對9000埠進行監聽。它會調起一個tcp/ip服務,nginx在調用的時候會走一次tcp請求流程,也就是3次握手4次揮手,會走到網路七層中的第四層傳輸層。相對來說這種方式性能會稍差一點,啟動php-fpm後使用nestat查看埠中會出現9000埠的佔用。
後者,使用的是unix套接字socket服務,通過sock文件來交換信息,性能相對好一些,因為它沒有tcp連接過程,也不會有9000埠的佔用。
對於高負載大訪問量的網站還是推薦使用unix方式,對於普通小網站來說,無所謂使用哪個都可以,tcp方式反而更容易配置和理解,也是php-fpm.conf中默認的監聽方式。
php-fpm.conf配置中的listen屬性用來配置監聽,這里的配置要和nginx中的一致,使用tcp的就監聽127.0.0.1:9000,使用unix的就設置成/tmp/php-cgi-56.sock。
以下內容摘自官方文檔:
===========
各自媒體平台均可搜索【硬核項目經理】
G. Mac M1安裝php開發環境
去年年底,蘋果推出了新款的M1晶元的mac,最近剛好要換電腦,考慮對比再三,還是選擇了M1晶元的mac;剛拿到手以後,擔心會有軟體不兼容啥的,網上也推薦作為主力開發的筆記本的話,不推薦M1,但是現在已經完全配置好了開發環境,安全下車了。下面就來簡單介紹下安裝過程中的步驟:
注意:如果沒有安裝brew,需要先安裝brew,使用arch -arm64 brew install安裝
首先搜索是否包含想要安裝的mysql版本,如下圖:
此處選擇[email protected]這個版本,我本地已經安裝完成了
安裝完成後,需要添加環境變數,這樣才能在任何目錄下面直接打mysql訪問
先查詢有哪些php的版本,之前看網上說的M1,目前還不支持php7.3以下的版本,所有我安裝了php7.4
等待安裝完成後,可以開始部署項目了,由於我的項目是thinkphp框架開發的,而且用到了redis,所以,這邊需要先安裝redis依賴
安裝php redis依賴(此處使用pecl安裝,網上有很多使用編譯安裝的方法,那種方法比較麻煩,而且需要配置的地方比較多,pecl安裝的話,快捷方便)
這個安裝完成後,就只需要去nginx目錄下面配置項目文件就OK了。
其他的不多說,主要提一點,就是thinkphp框架,重定向那邊的配置,location裡面的配置需要修改下,如下圖:
修改完成後,重啟伺服器,還要重啟php-fpm,這個是關鍵
H. 蘋果mac電腦中brew的安裝使用及卸載詳細教程
brew 又叫Homebrew,是Mac OSX上的軟體包管理工具,能在Mac中方便的安裝軟體或者卸載軟體, 只需要一個命令, 非常方便
brew類似ubuntu系統下的apt-get的功能
安裝brew
brew 的官方網站: http://brew.sh/ 在官方網站對brew的用法進行了詳細的描述
安裝方法: 在Mac中打開Termal: 輸入命令:
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
不知道為什麼, 在國內經常被屏蔽
使用brew安裝軟體
一個命令就搞定了, 比如安裝git
brew install git
比如安裝wget
brew install wget
使用brew卸載軟體
卸載更方便了
brew uninstall wget
使用brew查詢軟體
有時候,你不知道你安裝的軟體的名字, 那麼你需則禪茄要先搜索下, 查到包的名字。
比如我要安裝
brew search /wge*/
/wge*/是個正則表達式, 需要包含在/中
其他brew命令
brew list 列出已安裝的軟體
brew update 更新brew
brew home 用瀏覽器打開brew的官方網站
brew info 顯示軟體信息
brew deps 顯示包依賴
brew upgrade 升級
升級完畢後,會有一個summary(總結) 及 Caveats(注意事項),如:
php5.6
php7.0
系統中正在使用的版本php7.2
注意:
切換版本步驟:
mac下使用命令切換PHP版本,使用brew-php-switcher工具
修改apache下的http.conf配置文件信息,以對應環境中的PHP版本
參考文檔: http://www.jb51.net/os/MAC/101860.html
安裝完成後的記錄參考:主要有Extensions PHP CLI PHP-FPM
nginx
mysql 說明了mysql的密碼以及啟動方式
mqsql連接的一些坑及填坑方法
使孫察用命令 mysql -uroot 啟動了mysql,但是不能操作數據,提示如下:
('mysql.infoschema'@'localhost') does not exist
然後,決定使用命令 mysql_secure_installation 來啟動mysql,並填寫密碼,提示 ... Failed! Error: Table 'mysql.role_edges' doesn't exist :
解決辦法,升襲褲級mysql:
如下:
再次使用密碼登錄,第一步設置密碼,第二步移除anonymous user,禁止root遠程登錄,刪除測試數據等:
再次使用密碼登錄,進行查詢等操作,可正常使用:
mysql升級參考文檔:
apache和PHP的結合文檔:
外國友人的博客:
I. php-fpm的工作機制
概括來說,fpm 的實現就是創建一個 master 進程,在 master 進程中創建並監聽 socket,然後 fork 出多個子進程,這些子進程各自 accept 請求,子進程的處理非常簡單,它在啟動後阻塞在 accept 上,有請求到達後開始讀取請求數據,讀取完成後開始處理然後再返回,在這期間是不會接收其它請求的,也就是說 fpm 的子進程同時只能響應一個請求,只有把這個請求處理完成後才會 accept 下一個請求,這一點與 nginx 的事件驅動有很大的區別,nginx 的子進程通過 epoll 管理套接字,如果一個請求數據還未發送完成則會處理下一個請求,即一個進程會同時連接多個請求,它是非阻塞的模型,只處理活躍的套接字。
fpm 的 master 進程與 worker 進程之間不會直接進行通信,master 通過共享內存獲取 worker 進程的信息,比如 worker 進程當前狀態、已處理請求數等,當 master 進程要殺掉一個 worker 進程時則通過發送信號的方式通知 worker 進程。
fpm 可以同時監聽多個埠,每個埠對應一個 worker pool,而每個 pool 下對應多個 worker 進程,類似 nginx 中 server 概念。
在 php-fpm.conf 中通過[pool name]聲明一個 worker pool:
啟動 fpm 後查看進程:
具體實現上 worker pool 通過fpm_worker_pool_s這個結構表示,多個 worker pool 組成一個單鏈表
接下來看下 fpm 的啟動流程,從main()函數開始:
fpm_init()主要有以下幾個關鍵操作:
(1) fpm_conf_init_main():
解析 php-fpm.conf 配置文件,分配 worker pool 內存結構並保存到全局變數中:fpm_worker_all_pools,各 worker pool 配置解析到fpm_worker_pool_s->config中。
(2)fpm_scoreboard_init_main():
分配用於記錄 worker 進程運行信息的共享內存,按照 worker pool 的最大 worker 進程數分配,每個 worker pool 分配一個fpm_scoreboard_s結構,pool 下對應的每個 worker 進程分配一個fpm_scoreboard_proc_s結構。
(3)fpm_signals_init_main():
這里會通過socketpair()創建一個管道,這個管道並不是用於 master 與 worker 進程通信的,它只在 master 進程中使用,具體用途在稍後介紹 event 事件處理時再作說明。另外設置 master 的信號處理 handler,當 master 收到 SIGTERM、SIGINT、SIGUSR1、SIGUSR2、SIGCHLD、SIGQUIT 這些信號時將調用sig_handler()處理:
(4)fpm_sockets_init_main()
創建每個 worker pool 的 socket 套接字。
(5)fpm_event_init_main():
啟動 master 的事件管理,fpm 實現了一個事件管理器用於管理 IO、定時事件,其中 IO 事件通過 kqueue、epoll、poll、select 等管理,定時事件就是定時器,一定時間後觸發某個事件。
在fpm_init()初始化完成後接下來就是最關鍵的fpm_run()操作了,此環節將 fork 子進程,啟動進程管理器,另外 master 進程將不會再返回,只有各 worker 進程會返回,也就是說fpm_run()之後的操作均是 worker 進程的。
在 fork 後 worker 進程返回了監聽的套接字繼續 main() 後面的處理,而 master 將永遠阻塞在fpm_event_loop(),接下來分別介紹 master、worker 進程的後續操作。
fpm_run()執行後將 fork 出 worker 進程,worker 進程返回main()中繼續向下執行,後面的流程就是 worker 進程不斷 accept 請求,然後執行 PHP 腳本並返回。整體流程如下:
worker 進程一次請求的處理被劃分為 5 個階段:
worker 處理到各個階段時將會把當前階段更新到fpm_scoreboard_proc_s->request_stage,master 進程正是通過這個標識判斷 worker 進程是否空閑的。
接下來我們來看下 master 是如何管理 worker 進程的,首先介紹下三種不同的進程管理方式:
前面介紹到在fpm_run()中 master 進程將進入fpm_event_loop():
這就是 master 整體的處理,其進程管理主要依賴注冊的幾個事件,接下來我們詳細分析下這幾個事件的功能。
(1)sp[1]管道可讀事件:
在 fpm_init() 階段 master 曾創建了一個全雙工的管道:sp,然後在這里創建了一個 sp[0] 可讀的事件,當 sp[0] 可讀時將交由 fpm_got_signal() 處理,向 sp[1] 寫數據時 sp[0] 才會可讀,那麼什麼時機會向 sp[1] 寫數據呢?前面已經提到了:當 master 收到注冊的那幾種信號時會寫入 sp[1] 端,這個時候將觸發 sp[0] 可讀事件。
這個事件是 master 用於處理信號的,我們根據 master 注冊的信號逐個看下不同用途:
具體處理邏輯在 fpm_got_signal() 函數中,這里不再羅列。
(2)fpm_pctl_perform_idle_server_maintenance_heartbeat():
這是進程管理實現的主要事件,master 啟動了一個定時器,每隔 1s 觸發一次,主要用於 dynamic、ondemand 模式下的 worker 管理,master 會定時檢查各 worker pool 的 worker 進程數,通過此定時器實現 worker 數量的控制,處理邏輯如下:
(3)fpm_pctl_heartbeat():
這個事件是用於限制 worker 處理單個請求最大耗時的,php-fpm.conf 中有一個request_terminate_timeout的配置項,如果 worker 處理一個請求的總時長超過了這個值那麼 master 將會向此 worker 進程發送kill -TERM信號殺掉 worker 進程,此配置單位為秒,默認值為 0 表示關閉此機制,另外 fpm 列印的 slow log 也是在這里完成的。
除了上面這幾個事件外還有一個沒有提到,那就是 ondemand 模式下 master 監聽的新請求到達的事件,因為 ondemand 模式下 fpm 啟動時是不會預創建 worker 的,有請求時才會生成子進程,所以請求到達時需要通知 master 進程,這個事件是在fpm_children_create_initial()時注冊的,事件處理函數為fpm_pctl_on_socket_accept(),具體邏輯這里不再展開,比較容易理解。
原文出處: https://www.fanhao.com/2017/10/internal-php-fpm.html
J. mac php brew安裝了兩個5.6版本,怎麼刪除其中一個
/private/etc/ sudo rm -rf php-fpm.conf.default php.ini php.ini.default /usr/bin/ sudo rm -rf php php-config phpdoc phpize /usr/include sudo rm -rf php /usr/lib sudo rm -rf php /usr/sbin sudo rm -rf php-fpm /usr/share sudo rm -rf php /usr/share/man/man一 sudo rm -rf php-config.一 php.一 phpize.一 /usr/share/man/man吧 sudo rm -rf php-fpm.吧 左邊是目錄,右邊是刪除命令.只刪除者飢碰了php,沒有刪除apache引用的php.so等文件 ps:不建議刪除自帶的首談php版本.因為一些軟體可能依賴於php環境.雖然可以自編譯或使肢兄用brew安裝新版本的php,但是不建議新手操作.切記操作前.先使用TM備份下系統.以便失誤後可以還原文件