久久久精品一区ed2k-女人被男人叉到高潮的视频-中文字幕乱码一区久久麻豆樱花-俄罗斯熟妇真实视频

php調(diào)用異步數(shù)據(jù)庫(kù) php guzzle 異步

php redis做mysql的緩存,怎么異步redis同步到mysql數(shù)據(jù)庫(kù)

對(duì)于變化頻率非??斓臄?shù)據(jù)來(lái)說(shuō),如果還選擇傳統(tǒng)的靜態(tài)緩存方式(Memocached、File System等)展示數(shù)據(jù),可能在緩存的存取上會(huì)有很大的開(kāi)銷,并不能很好的滿足需要,而Redis這樣基于內(nèi)存的NoSQL數(shù)據(jù)庫(kù),就非常適合擔(dān)任實(shí)時(shí)數(shù)據(jù)的容器。

創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供順義網(wǎng)站建設(shè)、順義做網(wǎng)站、順義網(wǎng)站設(shè)計(jì)、順義網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、順義企業(yè)網(wǎng)站模板建站服務(wù),十載順義做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

但是往往又有數(shù)據(jù)可靠性的需求,采用MySQL作為數(shù)據(jù)存儲(chǔ),不會(huì)因?yàn)閮?nèi)存問(wèn)題而引起數(shù)據(jù)丟失,同時(shí)也可以利用關(guān)系數(shù)據(jù)庫(kù)的特性實(shí)現(xiàn)很多功能。

所以就會(huì)很自然的想到是否可以采用MySQL作為數(shù)據(jù)存儲(chǔ)引擎,Redis則作為Cache。而這種需求目前還沒(méi)有看到有特別成熟的解決方案或工具,因此采用Gearman+PHP+MySQL UDF的組合異步實(shí)現(xiàn)MySQL到Redis的數(shù)據(jù)復(fù)制。

MySQL到Redis數(shù)據(jù)復(fù)制方案

無(wú)論MySQL還是Redis,自身都帶有數(shù)據(jù)同步的機(jī)制,比較常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog來(lái)實(shí)現(xiàn)的,這樣的數(shù)據(jù)復(fù)制其實(shí)還是一個(gè)異步過(guò)程,只不過(guò)當(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)同步的工作量是非常大的。

因此這里選擇了一種開(kāi)發(fā)成本更加低廉的方式,借用已經(jīng)比較成熟的MySQL UDF,將MySQL數(shù)據(jù)首先放入Gearman中,然后通過(guò)一個(gè)自己編寫的PHP Gearman Worker,將數(shù)據(jù)同步到Redis。比分析binlog的方式增加了不少流程,但是實(shí)現(xiàn)成本更低,更容易操作。

Gearman的安裝與使用

Gearman是一個(gè)支持分布式的任務(wù)分發(fā)框架。設(shè)計(jì)簡(jiǎn)潔,獲得了非常廣泛的支持。一個(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í)行者,一般需要自己編寫具體邏輯并通過(guò)守護(hù)進(jìn)程方式運(yùn)行,Gearman Worker接收到Gearman Client傳遞的任務(wù)內(nèi)容后,會(huì)按順序處理。

以前曾經(jīng)介紹過(guò)類似的后臺(tái)任務(wù)處理項(xiàng)目Resque。兩者的設(shè)計(jì)其實(shí)非常接近,簡(jiǎn)單可以類比為:

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

說(shuō)明Gearman已經(jīng)安裝成功。

PHP的Gearman擴(kuò)展可以通過(guò)pecl直接安裝

pecl install gearman

echo "extension=gearman.so"/etc/php5/conf.d/gearman.ini

service php5-fpm restart

但是實(shí)測(cè)發(fā)現(xiàn)ubuntu默認(rèn)安裝的gearman版本過(guò)低,直接運(yùn)行pecl install gearman會(huì)報(bào)錯(cuò)

configure: error: libgearman version 1.1.0or later required

因此Gearman + PHP擴(kuò)展建議通過(guò)編譯方式安裝,這里為了簡(jiǎn)單說(shuō)明,選擇安裝舊版本擴(kuò)展:

pecl install gearman-1.0.3

Gearman + PHP實(shí)例

為了更容易理解后文Gearman的運(yùn)行流程,這里不妨從一個(gè)最簡(jiǎn)單的Gearman實(shí)例來(lái)說(shuō)明,比如要進(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頁(yè)面后,將處理結(jié)束的信息返回用戶:

php client.php

查看一下Gearman的狀況:

(echo status ; sleep 0.1)| netcat127.0.0.14730

可以看到輸出為

writeLog ? ? ? ?100.

說(shuō)明已經(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。

通過(guò)MySQL UDF + Trigger同步數(shù)據(jù)到Gearman

MySQL要實(shí)現(xiàn)與外部程序互通的最好方式還是通過(guò)MySQL UDF(MySQL user defined functions)來(lái)實(shí)現(xiàn)。為了讓MySQL能將數(shù)據(jù)傳入Gearman,這里使用了lib_mysqludf_json和gearman-mysql-udf的組合。

安裝lib_mysqludf_json

使用lib_mysqludf_json的原因是因?yàn)镚earman只接受字符串作為入口參數(shù),可以通過(guò)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)行語(yǔ)句注冊(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)行語(yǔ)句注冊(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');

通過(guò)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ù)庫(kù)中更新一條數(shù)據(jù)查看Gearman是否生效。

Gearman PHP Worker將MySQL數(shù)據(jù)異步復(fù)制到Redis

Redis作為時(shí)下當(dāng)熱的NoSQL緩存解決方案無(wú)需過(guò)多介紹,其安裝及使用也非常簡(jiǎn)單:

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

通過(guò)這種方式將MySQL數(shù)據(jù)復(fù)制到Redis,經(jīng)測(cè)試單Worker基本可以瞬時(shí)完成。

php 如何異步插入數(shù)據(jù)庫(kù)

頁(yè)面1.php里面寫具體的執(zhí)行語(yǔ)句

頁(yè)面2.php直接使用curl調(diào)用頁(yè)面1.php 并設(shè)置超時(shí)時(shí)間;根據(jù)你自己的需求寫但是你不一定如果超時(shí)時(shí)間內(nèi) 數(shù)據(jù)庫(kù)沒(méi)執(zhí)行玩 那你可能就獲取不到插入結(jié)果了

訪問(wèn)2.php應(yīng)該就是你說(shuō)的異步了

如何實(shí)現(xiàn)PHP異步調(diào)用或者說(shuō)并行計(jì)算

用 ajax 實(shí)現(xiàn)異步加載 然后 i gnore_user_abort(true); //即使Client斷開(kāi)(如關(guān)掉瀏覽器),PHP腳本也可以繼續(xù)執(zhí)行. set_time_limit(0); while(1) { $fp = fopen('time_task.txt',"a+"); $str = date("Y-m-d h:i:s")."\n\r"; fwrite($fp,$str); fcl

php 怎樣實(shí)現(xiàn)異步處理接口

首先 php 7以下 不支持異步方式(有個(gè)類庫(kù) 可以勉強(qiáng)算是支持了異步 名字忘了)

其次 php腳本 由于是逐行解析的,不常駐線程(當(dāng)然可以設(shè)置為永久連接,不自動(dòng)超時(shí)退出) 異步意義不大。

第三 我懷疑你是想問(wèn)javascript的異步請(qǐng)求? 如何用php處理?

如果沒(méi)問(wèn)錯(cuò)的話 可以用其他方式來(lái)解決異步問(wèn)題,就是同時(shí)發(fā)出多個(gè)web request請(qǐng)求 等多個(gè)請(qǐng)求成功之后將結(jié)果寫入數(shù)據(jù)庫(kù)(文件) 然后 有一個(gè) 一直在等待結(jié)果的php請(qǐng)求進(jìn)程 一旦讀取到了這個(gè)寫入完畢的(數(shù)據(jù)庫(kù))文件結(jié)果 馬上返回給瀏覽器

當(dāng)前題目:php調(diào)用異步數(shù)據(jù)庫(kù) php guzzle 異步
網(wǎng)站地址:http://sd-ha.com/article26/doijpcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、服務(wù)器托管、微信小程序、移動(dòng)網(wǎng)站建設(shè)關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站制作