佳木斯湛栽影视文化发展公司

主頁(yè) > 知識(shí)庫(kù) > PHP多人模塊開發(fā)原理解析

PHP多人模塊開發(fā)原理解析

熱門標(biāo)簽:銀行業(yè)務(wù) 團(tuán)購(gòu)網(wǎng)站 科大訊飛語(yǔ)音識(shí)別系統(tǒng) 阿里云 Linux服務(wù)器 電子圍欄 Mysql連接數(shù)設(shè)置 服務(wù)器配置

作為世界上最“好”的語(yǔ)言,在web里占據(jù)著大概80%的份額,中小公司基本都說(shuō) lnmp 架構(gòu)。當(dāng)一個(gè)倉(cāng)庫(kù)開發(fā)人員大于1,20人的時(shí)候,每個(gè)人可能開發(fā)不同的模塊和功能,用代碼版本控制工具比如 git 開不同的分支,流程大概是先在本地搭一套完整的環(huán)境,開發(fā)好部署在測(cè)試環(huán)境,自測(cè)或者測(cè)試人員測(cè)試好之后部署在預(yù)發(fā)布環(huán)境,預(yù)發(fā)布基本和線上環(huán)境一樣,然后給產(chǎn)品驗(yàn)收,驗(yàn)收完成后再發(fā)布上線。

由于是并行開發(fā),肯定存在好幾個(gè)功能同時(shí)驗(yàn)收或者測(cè)試的情況,這個(gè)時(shí)候預(yù)發(fā)環(huán)境到底部署誰(shuí)的代碼呢?切換到A的分支,B就不能驗(yàn)收了。所以希望存在一個(gè)多人開發(fā)環(huán)境,每個(gè)人的開發(fā)流程互不影響。

PHP運(yùn)行原理

首先我們來(lái)分析下 PHP 的運(yùn)行原理,看看 PHP 的語(yǔ)言特點(diǎn)。當(dāng)我們從瀏覽器發(fā)起一個(gè)請(qǐng)求,我們的web服務(wù)器(Nginx、Apache等)監(jiān)聽了80或者443端口,我們來(lái)看一個(gè)最簡(jiǎn)單的 Nginx 的 vhost 配置:

server {
 listen    80;
 server_name test.com;
 
 root /data/gateway/html;
 index  index.php;

 location ~ \.php$ {
  fastcgi_pass  127.0.0.1:9001; #unix:/Users/run/php-fcgi.sock;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  include    fastcgi_params;
 }
}

Nginx 監(jiān)聽80端口,當(dāng)匹配到用戶訪問的域名是test.com后使用對(duì)應(yīng)的 vhost 配置。在服務(wù)器里PHP-FPM起一個(gè)服務(wù),監(jiān)聽一個(gè)端口(比如9001)或者一個(gè)unix socket,Nginx通過fastcgi_pass配置,將請(qǐng)求傳遞給 PHP-FPM 來(lái)解析PHP代碼,PHP解析器每次從index.php開始解析,一路處理下去、做一系列的邏輯處理、查詢數(shù)據(jù)庫(kù)或者緩存等操作,返回一個(gè) HTML 或者其他結(jié)果給 Nginx,Nginx 再返回給瀏覽器。流程如下圖:

CGI:是 Nginx 與 PHP_FPM 之間數(shù)據(jù)交換的一種協(xié)議。

FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。

PHP-CGI:是 PHP 對(duì) Nginx 提供的 CGI 協(xié)議的接口程序。

PHP-FPM:是 PHP 對(duì) Nginx 提供的 FastCGI 協(xié)議的接口程序,額外還提供了相對(duì)智能一些任務(wù)管理。

多人開發(fā)環(huán)境

從 PHP 原理我們可以看到,PHP其實(shí)只是一個(gè)解釋型的腳本語(yǔ)言,每次請(qǐng)求都要從index.php解析一次,那我們是不是可以在服務(wù)器根據(jù)不同開發(fā)者的名字,命名很多個(gè)文件夾,在各自文件夾里,clone 好代碼倉(cāng)庫(kù),切換到自己的分支。再讓 Nginx 處理每個(gè)人目錄下的index就可以了。比如直接訪問http://wulv.test.com/,在 Nginx 獲取到 wulv,把 root 設(shè)置到 wulv 這個(gè)目錄,這樣就訪問到 wulv 這個(gè)目錄下的代碼了。可以讓 Nginx 這樣設(shè)置:

set $who www;
if ($http_who != "") {
  set $who $http_who;
}
root /data/gateway/$who/html;

我們可以讓 URL 里攜帶用戶的目錄,在 Nginx 截取下來(lái),可以在一下幾個(gè)地方攜帶:

host: http://wulv.test.com

path: http://www.test.com/wulv

query: http://www.test.com?http_who=wulv

這樣大體上可以實(shí)現(xiàn)需求了,但還是有點(diǎn)問題,比如頁(yè)面里有些鏈接是寫死的,沒有使用相對(duì)路徑,你一點(diǎn)擊就又跑 www.test.com 去了,或者有些第三方應(yīng)用比如 OAuth 等需要校驗(yàn)域名,你和線上域名不一致根本無(wú)法登陸。所以需要其他方式來(lái)實(shí)現(xiàn),比如:

http request header

cookie

我們可以使用Modify Headers這個(gè)瀏覽器插件,修改http request 頭信息,設(shè)置一個(gè)參數(shù) http_who 為 wulv,然后在 Nginx 獲取。

拓展

如果有條件的話,其實(shí)還可以做一個(gè)網(wǎng)關(guān)服務(wù)器,做一個(gè)配置頁(yè)面,在配置頁(yè)面里配置一下需要訪問的目錄,下次訪問,網(wǎng)關(guān)就直接幫你設(shè)置http header,代理到對(duì)應(yīng)服務(wù)器。這樣連瀏覽器插件都不需要裝了,對(duì)運(yùn)營(yíng)和產(chǎn)品設(shè)計(jì)更加友好。

標(biāo)簽:江蘇 萍鄉(xiāng) 蚌埠 衡水 衢州 大理 廣元 棗莊

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP多人模塊開發(fā)原理解析》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    普兰店市| 乌什县| 邛崃市| 翁源县| 运城市| 新乡县| 平乡县| 福清市| 芦溪县| 台山市| 平江县| 阿拉善右旗| 阜宁县| 陕西省| 乌海市| 安宁市| 贺州市| 绥德县| 古丈县| 太原市| 静海县| 永春县| 海林市| 太保市| 和田县| 衡阳市| 郓城县| 宁强县| 南开区| 惠州市| 腾冲县| 桓台县| 南华县| 武安市| 枝江市| 怀来县| 蓝山县| 军事| 临朐县| 衡南县| 建瓯市|