jquery中的ajax有個(gè)async:false,設(shè)為這個(gè)屬性就可以同時(shí)調(diào)用php
創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),萬秀企業(yè)網(wǎng)站建設(shè),萬秀品牌網(wǎng)站建設(shè),網(wǎng)站定制,萬秀網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,萬秀網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
默認(rèn)是true:異步,false:同步。
$.ajax({
type: "post",
url: "path",
cache:false,
async:false,
success: function(data){
}
});
在實(shí)際應(yīng)用中,我們要管理一個(gè)客戶分類,實(shí)現(xiàn)對(duì)客戶分類的增加、刪除和修改等操作,如何讓這些操作變得更人性化,讓用戶操作起來更加方便成了我們必須研究的課題。
準(zhǔn)備階段
您需要具備HTML和Jquery等前端知識(shí),以及基本的PHP程序和MySql數(shù)據(jù)庫相關(guān)知識(shí)。要實(shí)現(xiàn)本文中的DEMO示例,首先需要一個(gè)mysql數(shù)據(jù)庫:
CREATE TABLE `catalist` ( `cid` int(11) NOT NULL auto_increment, `title` varchar(100) NOT NULL, `sort` mediumint(6) NOT NULL default '0', PRIMARY KEY (`cid`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
其次在頁面中引入jquery庫,以及操作結(jié)果提示插件jNotify和刪除確認(rèn)插件hiAlert。后者兩個(gè)插件在本站都有詳細(xì)的講解,讀者可以通過鏈接了解下:
將需要準(zhǔn)備的文件一并加入到index.php的head之間。
script type="text/javascript" src="js/jquery.js"/script script type="text/javascript" src="js/jNotify.jquery.js"/script script type="text/javascript" src="js/jquery.alert.js"/script script type="text/javascript" src="js/global.js"/script link rel="stylesheet" type="text/css" href="css/alert.css" /
準(zhǔn)備完畢我們進(jìn)入主題。
index.php
index.php是主體頁面,讀取了數(shù)據(jù)庫中的分類數(shù)據(jù),以列表展示,并提供了增加、刪除和修改的功能按鈕。
?php include_once('connect.php'); //連接數(shù)據(jù)庫 $query = mysql_query("select * from catalist order by cid asc"); while($row=mysql_fetch_array($query)){ $list .= "li rel='".$row['cid']."'span class='del' title='刪除'/span span class='edit' title='編輯'/spanspan class='txt'".$row['title']."/span/li"; } ?
以上代碼通過讀取數(shù)據(jù)表中的數(shù)據(jù),返回一個(gè)列表字符串。然后我們要將字符串輸出到對(duì)應(yīng)的列表中,代碼如下:
div class="selectlist" h3客戶類別/h3 ul id="catalist" ?php echo $list;? /ul pa href="javascript:;" onclick="addOpt()"新增一項(xiàng)/a/p /div
試著往數(shù)據(jù)表中添加幾條數(shù)據(jù),可以看到一個(gè)分類列表。
CSS
.input{width:160px; padding:2px; border:1px solid #d3d3d3} .cur_tr{background:#ffc} .selectlist{width:280px; margin:30px auto; border:1px solid #ccc;} .selectlist h3{height:32px; line-height:32px; padding:0 4px; border-bottom:1px dotted #d3d3d3; background:#f7f7f7} .selectlist h3 span{float:right; font-weight:500} .selectlist ul{margin-top:4px; margin-left:20px; list-style-type: disc} .selectlist ul li{line-height:26px} .selectlist p{line-height:28px; padding-left:6px} .selectlist ul li span{width:20px; height:20px} .selectlist ul li span.edit{ float:right;background:url(images/edits.gif) no-repeat 0 5px; cursor:pointer} .selectlist ul li span.del,.selectlist ul li span.dels,.selectlist ul li span.cancer{ float:right;background:url(images/del.gif) no-repeat 0 5px; cursor:pointer} .selectlist ul li span.ok,.selectlist ul li span.oks{float:right;background:url(images/ok.gif) no-repeat 0 5px; cursor:pointer}
CSS我就不詳細(xì)講解,看下就明白了,最終顯示的效果如圖:
新增項(xiàng)操作
在global.js加入addOpt()函數(shù):
function addOpt(){ var str = "lispan class='dels' title='取消'/spanspan class='ok' title='保存'/span input type='text' class='input' //li"; $("#catalist").append(str); }
通過單擊“新增一項(xiàng)”鏈接,向DOM中添加了一個(gè)新增項(xiàng)的輸入框。
當(dāng)用戶輸入內(nèi)容后,點(diǎn)擊“保存”,將會(huì)觸發(fā)一個(gè)ajax操作,先看代碼:
$(function(){ //保存新增項(xiàng) $(".ok").live('click',function(){ var btn = $(this); var input_str = btn.parent().find('input').val(); if(input_str==""){ jNotify("請(qǐng)輸入類別!"); return false; } var str = escape(input_str); $.getJSON("post.php?action=addtitle="+str,function(json){ if(json.success==1){ var li = "li rel='"+json.id+"'span class='del' title='刪除' /spanspan class='edit' title='編輯'/spanspan class='txt'"+ json.title+"/span/li"; $("#catalist").append(li); btn.parent().remove(); jSuccess("恭喜,操作成功!"); }else{ jNotify("出錯(cuò)了!"); return false; } }); }); });
首先獲取用戶輸入的內(nèi)容,如果沒有輸入任何內(nèi)容則提示用戶輸入內(nèi)容,然后將用戶輸入的內(nèi)容進(jìn)行escape編碼,保證中文字符能正確傳輸給后臺(tái)程序識(shí)別。然后通過$.getJSON方法向后臺(tái)post.php發(fā)起一個(gè)異步的Ajax請(qǐng)求。后臺(tái)post.php接收參數(shù)值并進(jìn)行相關(guān)處理,前端代碼通過響應(yīng)后臺(tái)返回的JSON數(shù)據(jù),如果新增成功,則向列表后面追加一項(xiàng),并提示用戶“操作成功”,如果失敗則提示用戶“出錯(cuò)了”。
如果要取消新增項(xiàng)操作,只需當(dāng)單擊“取消”按鈕時(shí)執(zhí)行以下代碼:
//取消新增項(xiàng) $(".dels").live('click',function(){ $(this).parent().remove(); //將新增項(xiàng)移除 });
后臺(tái)post.php需要處理新增項(xiàng)內(nèi)容,代碼如下:
include_once('connect.php'); //連接數(shù)據(jù)庫 $action = $_GET['action']; switch($action){ case 'add': //新增項(xiàng) $title = uniDecode($_GET['title'],'utf-8'); $title = htmlspecialchars($title,ENT_QUOTES); $query = mysql_query("insert into catalist (cid,title) values (NULL,'$title')"); if($query){ $insertid = mysql_insert_id($link); $arr = array('id'=$insertid,'title'=$title,'success'=1); }else{ $arr = array('success'=2); } echo json_encode($arr); break; case '': break; }
通過接收前端提交的內(nèi)容,進(jìn)行解碼后,寫入數(shù)據(jù)表中,并輸出JSON數(shù)據(jù)格式供前臺(tái)處理。關(guān)于uniDecode()函數(shù),讀者可以下載源碼了解,主要是為了正確讀取解析jquery通過異步提交的中文字符串。
添加項(xiàng)操作已經(jīng)完成,下面請(qǐng)看刪除項(xiàng)操作。刪除項(xiàng)操作
回到global.js,在$(function(){})加入下面的代碼:
//刪除項(xiàng) $(".del").live('click',function(){ var btn = $(this); var id = btn.parent().attr('rel'); var URL = "post.php?action=del"; hiConfirm('您確定要?jiǎng)h除嗎?', '提示',function(r){ if(r){ $.ajax({ type: "POST", url: URL, data: "id="+id, success: function(msg){ if(msg==1){ jSuccess("刪除成功!"); btn.parent().remove(); }else{ jNotify("操作失敗!"); return false; } } }); } }); });
顯然,通過單擊“刪除”按鈕,同樣是向后臺(tái)post.php發(fā)送一個(gè)ajax請(qǐng)求,將刪除項(xiàng)對(duì)應(yīng)的參數(shù)ID發(fā)送給后臺(tái)并響應(yīng)后臺(tái)處理結(jié)果,如果成功,則提示用戶“刪除成功”,并通過remove()將數(shù)據(jù)項(xiàng)移除,如果失敗,則提示“操作失敗”。
后臺(tái)post.php接收參數(shù)并作出相應(yīng)的處理:
case 'del': //刪除項(xiàng) $id = $_POST['id']; $query = mysql_query("delete from catalist where cid=".$id); if($query){ echo '1'; }else{ echo '2'; } break;
以上這段代碼片段,加在post.php的switch語句中,執(zhí)行了刪除語句,并輸出執(zhí)行結(jié)果供前端處理。
對(duì)于變化頻率非??斓臄?shù)據(jù)來說,如果還選擇傳統(tǒng)的靜態(tài)緩存方式(Memocached、File System等)展示數(shù)據(jù),可能在緩存的存取上會(huì)有很大的開銷,并不能很好的滿足需要,而Redis這樣基于內(nèi)存的NoSQL數(shù)據(jù)庫,就非常適合擔(dān)任實(shí)時(shí)數(shù)據(jù)的容器。
但是往往又有數(shù)據(jù)可靠性的需求,采用MySQL作為數(shù)據(jù)存儲(chǔ),不會(huì)因?yàn)閮?nèi)存問題而引起數(shù)據(jù)丟失,同時(shí)也可以利用關(guān)系數(shù)據(jù)庫的特性實(shí)現(xiàn)很多功能。
所以就會(huì)很自然的想到是否可以采用MySQL作為數(shù)據(jù)存儲(chǔ)引擎,Redis則作為Cache。而這種需求目前還沒有看到有特別成熟的解決方案或工具,因此采用Gearman+PHP+MySQL UDF的組合異步實(shí)現(xiàn)MySQL到Redis的數(shù)據(jù)復(fù)制。
MySQL到Redis數(shù)據(jù)復(fù)制方案
無論MySQL還是Redis,自身都帶有數(shù)據(jù)同步的機(jī)制,比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來實(shí)現(xiàn)的,這樣的數(shù)據(jù)復(fù)制其實(shí)還是一個(gè)異步過程,只不過當(dāng)服務(wù)器都在同一內(nèi)網(wǎng)時(shí),異步的延遲幾乎可以忽略。
那么理論上也可以用同樣方式,分析MySQL的binlog文件并將數(shù)據(jù)插入Redis。但是這需要對(duì)binlog文件以及MySQL有非常深入的理解,同時(shí)由于binlog存在Statement/Row/Mixedlevel多種形式,分析binlog實(shí)現(xiàn)同步的工作量是非常大的。
因此這里選擇了一種開發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的MySQL UDF,將MySQL數(shù)據(jù)首先放入Gearman中,然后通過一個(gè)自己編寫的PHP Gearman Worker,將數(shù)據(jù)同步到Redis。比分析binlog的方式增加了不少流程,但是實(shí)現(xiàn)成本更低,更容易操作。
Gearman的安裝與使用
Gearman是一個(gè)支持分布式的任務(wù)分發(fā)框架。設(shè)計(jì)簡潔,獲得了非常廣泛的支持。一個(gè)典型的Gearman應(yīng)用包括以下這些部分:
Gearman Job Server:Gearman核心程序,需要編譯安裝并以守護(hù)進(jìn)程形式運(yùn)行在后臺(tái)
Gearman Client:可以理解為任務(wù)的收件員,比如在后臺(tái)執(zhí)行一個(gè)發(fā)送郵件的任務(wù),可以在程序中調(diào)用一個(gè)Gearman Client并傳入郵件的信息,然后就可以將執(zhí)行結(jié)果立即展示給用戶,而任務(wù)本身會(huì)慢慢在后臺(tái)運(yùn)行。
Gearman Worker:任務(wù)的真正執(zhí)行者,一般需要自己編寫具體邏輯并通過守護(hù)進(jìn)程方式運(yùn)行,Gearman Worker接收到Gearman Client傳遞的任務(wù)內(nèi)容后,會(huì)按順序處理。
以前曾經(jīng)介紹過類似的后臺(tái)任務(wù)處理項(xiàng)目Resque。兩者的設(shè)計(jì)其實(shí)非常接近,簡單可以類比為:
Gearman Job Server:對(duì)應(yīng)Resque的Redis部分
Gearman Client:對(duì)應(yīng)Resque的Queue操作
Gearman Worker:對(duì)應(yīng)Resque的Worker和Job
這里之所以選擇Gearman而不是Resque是因?yàn)镚earman提供了比較好用的MySQL UDF,工作量更小。
安裝Gearman及PHP Gearman擴(kuò)展
以下均以Ubuntu12.04為例。
apt-get install gearman gearman-server libgearman-dev
檢查Gearman的運(yùn)行狀況:
/etc/init.d/gearman-job-server status
* gearmand is running
說明Gearman已經(jīng)安裝成功。
PHP的Gearman擴(kuò)展可以通過pecl直接安裝
pecl install gearman
echo "extension=gearman.so"/etc/php5/conf.d/gearman.ini
service php5-fpm restart
但是實(shí)測發(fā)現(xiàn)ubuntu默認(rèn)安裝的gearman版本過低,直接運(yùn)行pecl install gearman會(huì)報(bào)錯(cuò)
configure: error: libgearman version 1.1.0or later required
因此Gearman + PHP擴(kuò)展建議通過編譯方式安裝,這里為了簡單說明,選擇安裝舊版本擴(kuò)展:
pecl install gearman-1.0.3
Gearman + PHP實(shí)例
為了更容易理解后文Gearman的運(yùn)行流程,這里不妨從一個(gè)最簡單的Gearman實(shí)例來說明,比如要進(jìn)行一個(gè)文件處理的操作,首先編寫一個(gè)Gearman Client并命名為client.php:
?php
$client =newGearmanClient();
$client-addServer();
$client-doBackground('writeLog','Log content');
echo '文件已經(jīng)在后臺(tái)操作';
運(yùn)行這個(gè)文件,相當(dāng)于模擬用戶請(qǐng)求一個(gè)Web頁面后,將處理結(jié)束的信息返回用戶:
php client.php
查看一下Gearman的狀況:
(echo status ; sleep 0.1)| netcat127.0.0.14730
可以看到輸出為
writeLog ? ? ? ?100.
說明已經(jīng)在Gearman中建立了一個(gè)名為writeLog的任務(wù),并且有1個(gè)任務(wù)在隊(duì)列等待中。
而上面的4列分別代表當(dāng)前的Gearman的運(yùn)行狀態(tài):
任務(wù)名稱
在等待隊(duì)列中的任務(wù)
正在運(yùn)行的任務(wù)
正在運(yùn)行的Worker進(jìn)程
可以使用watch進(jìn)行實(shí)時(shí)監(jiān)控:
watch -n 1"(echo status; sleep 0.1) | nc 127.0.0.1 4730"
然后我們需要編寫一個(gè)Gearman Worker命名為worker.php:
?php
$worker =newGearmanWorker();
$worker-addServer();
$worker-addFunction('writeLog','writeLog');while($worker-work());function writeLog($job){
$log = $job-workload();file_put_contents(__DIR__ .'/gearman.log', $log ."\n", FILE_APPEND | LOCK_EX);}
Worker使用一個(gè)while死循環(huán)實(shí)現(xiàn)守護(hù)進(jìn)程,運(yùn)行
php worker.php
可以看到Gearman狀態(tài)變?yōu)椋?/p>
writeLog ? ? ? ?001
同時(shí)查看同目錄下gearman.log,內(nèi)容應(yīng)為從Client傳入的值Log content。
通過MySQL UDF + Trigger同步數(shù)據(jù)到Gearman
MySQL要實(shí)現(xiàn)與外部程序互通的最好方式還是通過MySQL UDF(MySQL user defined functions)來實(shí)現(xiàn)。為了讓MySQL能將數(shù)據(jù)傳入Gearman,這里使用了lib_mysqludf_json和gearman-mysql-udf的組合。
安裝lib_mysqludf_json
使用lib_mysqludf_json的原因是因?yàn)镚earman只接受字符串作為入口參數(shù),可以通過lib_mysqludf_json將MySQL中的數(shù)據(jù)編碼為JSON字符串
apt-get install libmysqlclient-dev
wget
unzip master.zip
cd lib_mysqludf_json-master/
rm lib_mysqludf_json.so
gcc $(mysql_config --cflags)-shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c
可以看到重新編譯生成了 lib_mysqludf_json.so 文件,此時(shí)需要查看MySQL的插件安裝路徑:
mysql -u root -pPASSWORD --execute="show variables like '%plugin%';"+---------------+------------------------+|Variable_name|Value|+---------------+------------------------+| plugin_dir ? ?|/usr/lib/mysql/plugin/|+---------------+------------------------+
然后將 lib_mysqludf_json.so 文件復(fù)制到對(duì)應(yīng)位置:
cp lib_mysqludf_json.so /usr/lib/mysql/plugin/
最后登入MySQL運(yùn)行語句注冊(cè)UDF函數(shù):
CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';
安裝gearman-mysql-udf
方法幾乎一樣:
apt-get install libgearman-dev
wget
tar -xzf gearman-mysql-udf-0.6.tar.gz
cd gearman-mysql-udf-0.6./configure --with-mysql=/usr/bin/mysql_config
-libdir=/usr/lib/mysql/plugin/
make make install
登入MySQL運(yùn)行語句注冊(cè)UDF函數(shù):
CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';
CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';
最后指定Gearman服務(wù)器的信息:
SELECT gman_servers_set('127.0.0.1:4730');
通過MySQL觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)同步
最終同步哪些數(shù)據(jù),同步的條件,還是需要根據(jù)實(shí)際情況決定,比如將數(shù)據(jù)表data的數(shù)據(jù)在每次更新時(shí)同步,那么編寫Trigger如下:
DELIMITER $$
CREATE TRIGGER datatoredis AFTER UPDATE ON data
FOR EACH ROW BEGIN
SET @ret=gman_do_background('syncToRedis', json_object(NEW.id as`id`, NEW.volume as`volume`));END$$
DELIMITER ;
嘗試在數(shù)據(jù)庫中更新一條數(shù)據(jù)查看Gearman是否生效。
Gearman PHP Worker將MySQL數(shù)據(jù)異步復(fù)制到Redis
Redis作為時(shí)下當(dāng)熱的NoSQL緩存解決方案無需過多介紹,其安裝及使用也非常簡單:
apt-get install redis-server
pecl install redis
echo "extension=redis.so"/etc/php5/conf.d/redis.ini
然后編寫一個(gè)Gearman Worker:redis_worker.php
#!/usr/bin/env php?
$worker =newGearmanWorker();
$worker-addServer();
$worker-addFunction('syncToRedis','syncToRedis');
$redis =newRedis();
$redis-connect('127.0.0.1',6379);while($worker-work());function syncToRedis($job){global $redis;
$workString = $job-workload();
$work = json_decode($workString);if(!isset($work-id)){returnfalse;}
$redis-set($work-id, $workString);}
最后需要將Worker在后臺(tái)運(yùn)行:
nohup php redis_worker.php
通過這種方式將MySQL數(shù)據(jù)復(fù)制到Redis,經(jīng)測試單Worker基本可以瞬時(shí)完成。
php 高并發(fā)解決思路解決方案,如何應(yīng)對(duì)網(wǎng)站大流量高并發(fā)情況。本文為大家總結(jié)了常用的處理方式,但不是細(xì)節(jié),后續(xù)一系列細(xì)節(jié)教程給出。希望大家喜歡。
一 高并發(fā)的概念
在互聯(lián)網(wǎng)時(shí)代,并發(fā),高并發(fā)通常是指并發(fā)訪問。也就是在某個(gè)時(shí)間點(diǎn),有多少個(gè)訪問同時(shí)到來。
二 高并發(fā)架構(gòu)相關(guān)概念
1、QPS (每秒查詢率) : 每秒鐘請(qǐng)求或者查詢的數(shù)量,在互聯(lián)網(wǎng)領(lǐng)域,指每秒響應(yīng)請(qǐng)求數(shù)(指 HTTP 請(qǐng)求)
2、PV(Page View):綜合瀏覽量,即頁面瀏覽量或者點(diǎn)擊量,一個(gè)訪客在 24 小時(shí)內(nèi)訪問的頁面數(shù)量
--注:同一個(gè)人瀏覽你的網(wǎng)站的同一頁面,只記做一次 pv
3、吞吐量(fetches/sec) :單位時(shí)間內(nèi)處理的請(qǐng)求數(shù)量 (通常由 QPS 和并發(fā)數(shù)決定)
4、響應(yīng)時(shí)間:從請(qǐng)求發(fā)出到收到響應(yīng)花費(fèi)的時(shí)間
5、獨(dú)立訪客(UV):一定時(shí)間范圍內(nèi),相同訪客多次訪問網(wǎng)站,只計(jì)算為 1 個(gè)獨(dú)立訪客
6、帶寬:計(jì)算帶寬需關(guān)注兩個(gè)指標(biāo),峰值流量和頁面的平均大小
7、日網(wǎng)站帶寬: PV/統(tǒng)計(jì)時(shí)間(換算到秒) * 平均頁面大?。╧b)* 8
三 需要注意點(diǎn):
1、QPS 不等于并發(fā)連接數(shù)(QPS 是每秒 HTTP 請(qǐng)求數(shù)量,并發(fā)連接數(shù)是系統(tǒng)同時(shí)處理的請(qǐng)求數(shù)量)
2、峰值每秒請(qǐng)求數(shù)(QPS)= (總 PV 數(shù)*80%)/ (六小時(shí)秒數(shù)*20%)【代表 80%的訪問量都集中在 20%的時(shí)間內(nèi)】
3、壓力測試: 測試能承受的最大并發(fā)數(shù) 以及測試最大承受的 QPS 值
4、常用的性能測試工具【ab,wrk,httpload,Web Bench,Siege,Apache JMeter】
四 優(yōu)化
1、當(dāng) QPS 小于 50 時(shí)
優(yōu)化方案:為一般小型網(wǎng)站,不用考慮優(yōu)化
2、當(dāng) QPS 達(dá)到 100 時(shí),遇到數(shù)據(jù)查詢瓶頸
優(yōu)化方案: 數(shù)據(jù)庫緩存層,數(shù)據(jù)庫的負(fù)載均衡
3、當(dāng) QPS 達(dá)到 800 時(shí), 遇到帶寬瓶頸
優(yōu)化方案:CDN 加速,負(fù)載均衡
4、當(dāng) QPS 達(dá)到 1000 時(shí)
優(yōu)化方案: 做 html 靜態(tài)緩存
5、當(dāng) QPS 達(dá)到 2000 時(shí)
優(yōu)化方案: 做業(yè)務(wù)分離,分布式存儲(chǔ)
五、高并發(fā)解決方案案例:
1、流量優(yōu)化
防盜鏈處理(去除惡意請(qǐng)求)
2、前端優(yōu)化
(1) 減少 HTTP 請(qǐng)求[將 css,js 等合并]
(2) 添加異步請(qǐng)求(先不將所有數(shù)據(jù)都展示給用戶,用戶觸發(fā)某個(gè)事件,才會(huì)異步請(qǐng)求數(shù)據(jù))
(3) 啟用瀏覽器緩存和文件壓縮
(4) CDN 加速
(5) 建立獨(dú)立的圖片服務(wù)器(減少 I/O)
3、服務(wù)端優(yōu)化
(1) 頁面靜態(tài)化
(2) 并發(fā)處理
(3) 隊(duì)列處理
4、數(shù)據(jù)庫優(yōu)化
(1) 數(shù)據(jù)庫緩存
(2) 分庫分表,分區(qū)
(3) 讀寫分離
(4) 負(fù)載均衡
5、web 服務(wù)器優(yōu)化
(1) nginx 反向代理實(shí)現(xiàn)負(fù)載均衡
(2) lvs 實(shí)現(xiàn)負(fù)載均衡
?php
class?Analytics_SomeConsumer?{
public?function?__construct()?{
$this-socket?=?socket_create(AF_INET,?SOCK_STREAM,?SOL_TCP);
socket_set_nonblock($this-socket);
socket_connect($this-socket,?$this-host,?$this-port);
$this-queue?=?array();
}
public?function?__destruct()?{
$payload?=?json_encode($this-queue);
#?...?//?wait?for?socket?to?be?writeable
socket_write($this-socket,?$payload);
socket_close($this-socket);
}
public?function?track($item)?{
array_push($this-queue,?$item);
}
?
可以全部存儲(chǔ)到服務(wù)器。然后服務(wù)器做一個(gè)隊(duì)列,后臺(tái)有個(gè)單獨(dú)線程處理圖片上傳到七牛的任務(wù),圖片處理完成之后進(jìn)行回調(diào)處理后續(xù)任務(wù)。
前端顯示處理中的類似字樣,然后等待后臺(tái)處理完成,前臺(tái)頁面再去進(jìn)行修改。
分享標(biāo)題:php異步請(qǐng)求數(shù)據(jù)庫 php如何實(shí)現(xiàn)異步進(jìn)程
文章來源:http://chinadenli.net/article14/dodedge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、、企業(yè)網(wǎng)站制作、外貿(mào)建站、網(wǎng)站營銷、網(wǎng)站收錄
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)