淺析php如何實(shí)現(xiàn)App常用的秒發(fā)功能
前言
想象一下,我們平常發(fā)朋友圈的時(shí)候,N張圖片配上文字,嗖的一下就發(fā)出去了,不帶任何拖泥帶水的那種,體驗(yàn)感覺(jué)好爽~。
但是我們停下來(lái)用技術(shù)手段思考一下,這可能嗎?有些2G網(wǎng)絡(luò)最多也就幾十K網(wǎng)速,我們的圖片隨便一張都幾M,即使壓縮過(guò)也有幾百K,怎么可能瞬間發(fā)出消息呢?
現(xiàn)在想想,是不是有些詭異呢~
其實(shí)吧,眾多社交軟件(微博,微信)都是用了一種秒發(fā)機(jī)制。他并不是真的先去發(fā)送然后發(fā)送完畢再告訴你發(fā)送成功,而是直接告訴你發(fā)送成功,然后后臺(tái)再偷偷去上傳你發(fā)的東西,所以在網(wǎng)速不好的時(shí)候我們會(huì)經(jīng)常發(fā)現(xiàn)一個(gè)現(xiàn)象,剛開(kāi)始發(fā)出的朋友圈剛開(kāi)始很正常,但是過(guò)了幾分鐘后,提示我們發(fā)送失??!這很很尷尬啊,明明剛開(kāi)始你什么也沒(méi)說(shuō)啊,到了最關(guān)鍵的時(shí)候你告訴我不行了..
不要被高大上的技術(shù)嚇到了,無(wú)非就是做了一些小技巧而已,真的很基礎(chǔ),但是也真的很實(shí)用。
在討論技術(shù)前首先聲明一些初始條件。
1.對(duì)數(shù)據(jù)庫(kù)表結(jié)構(gòu)進(jìn)行了一些特殊改造: 朋友圈內(nèi)容表有一個(gè)特殊的字段status, status值有兩種情況,值可以為1或者2,
值為1是朋友圈未發(fā)布。 值為2是朋友圈已發(fā)布。 (暫時(shí)看不懂為什么這樣做的同學(xué),可以先繼續(xù)閱讀,后面會(huì)講解)
2.此篇文章的秒發(fā)功能指的有圖片的情況下使用,因?yàn)橛袌D片的話(huà),圖片上傳太慢,所以需要采用秒發(fā)機(jī)制,但是沒(méi)有圖片純文字的話(huà),就沒(méi)太大的必要了,因?yàn)槲谋緜鬏斄亢艿?,按照正常流程發(fā)送即可。
3.此篇文章的代碼是基于PhalApi框架,語(yǔ)法都比較簡(jiǎn)單,有過(guò)ORM操作經(jīng)驗(yàn)的同學(xué)應(yīng)該都看得懂
4.此篇文章主要講解APP的秒發(fā)功能,WEB端不是特別需要這個(gè)功能,因?yàn)楝F(xiàn)代網(wǎng)絡(luò)足以我們的PC一次性發(fā)送很多很多張圖片(10M/s,20M/s)
大方向討論一下整個(gè)執(zhí)行流程:
客戶(hù)端調(diào)用發(fā)布API,服務(wù)端進(jìn)行發(fā)布內(nèi)容(publish.php),如果是有圖片,那么客戶(hù)端還要額外調(diào)用一個(gè)上傳API(upload.php),在這個(gè)上傳API(upload.php)還沒(méi)完成工作的時(shí)候,客戶(hù)端會(huì)直接告訴你發(fā)布成功(其實(shí)當(dāng)前是沒(méi)有上傳完成,后面有一個(gè)進(jìn)程在拼命幫你上傳著呢),然后客戶(hù)端會(huì)把你發(fā)的文字和圖片暫時(shí)拼接好顯示給你看(當(dāng)前只有你能看到,你朋友圈其他人是看不到的),然后等待著上傳API(upload.php)的結(jié)果/當(dāng)然也可能上傳超時(shí)(通常一分鐘內(nèi)會(huì)出結(jié)果),如果成功的話(huà)則順利上傳,失敗的話(huà)則報(bào)發(fā)送失敗,但是在等待結(jié)果的一分鐘之內(nèi),他會(huì)先讓你覺(jué)得你已經(jīng)發(fā)送了,除非上傳失敗,才會(huì)在后來(lái)提醒你。
那么讓我們?cè)诩夹g(shù)層面來(lái)分析一下這套機(jī)制吧:

當(dāng)我們點(diǎn)上右上角的發(fā)送鍵后,有兩個(gè)進(jìn)程在同時(shí)啟動(dòng),其中一個(gè)進(jìn)程是幫你上傳文本并且告訴你已經(jīng)發(fā)送成功啦(publish.php),另外一個(gè)進(jìn)程是偷偷去上傳你發(fā)的圖片(upload.php),具體代碼如下:
Publish.php
<?php //正常獲取數(shù)據(jù)(文本,圖片,位置信息等) … Code … Code … //進(jìn)行判斷,如果有圖片則為未發(fā)布(status為1),無(wú)圖片則為立即發(fā)布(status為2) //如果有圖片則通過(guò)返回標(biāo)識(shí)符告訴客戶(hù)端,讓他趕緊去調(diào)用真實(shí)的上傳邏輯upload.php,我們這只把最基本的文本上傳好,再設(shè)置多一個(gè)status而已~ $status = ($pic_num > 0) ? 1 : 2; //拼接入庫(kù)數(shù)據(jù) $where_data = array( "status"=> $status) //數(shù)據(jù)入庫(kù) DI()->notorm-> friends ->insert($where_data); ?>
看出玄妙了嗎?我們對(duì)入庫(kù)的status字段進(jìn)行了一次判斷,分別會(huì)有1(未發(fā)布)和2(已發(fā)布)兩種情況,那么在讀取數(shù)據(jù)的時(shí)候我們應(yīng)該怎么做呢(list.php)?
那么展示頁(yè)面就是這樣:
Lists.php
<?php
//code ..
//獲取文字信息
Code..
//獲取圖片信息
//(它在獲取當(dāng)前用戶(hù)pic表內(nèi)的f_id(即獲取朋友圈圖片),最關(guān)鍵的地方是where條件
$data= DI()->notorm->pic->select('f_id')->where("status > 1 OR (status = 1 && u_id = {$u_id})")->->fetchAll();
//code ..
?>
此處的where條件是秒發(fā)機(jī)制的最關(guān)鍵的地方:
status大于1(已發(fā)表)或者等于1(未發(fā)布),(tips:status在有圖片的情況下默認(rèn)值為1)但是屬于當(dāng)前用戶(hù)發(fā)布的內(nèi)容,都可以讀出來(lái),這就有一個(gè)很奇妙的現(xiàn)象,就是無(wú)論如何,我們自己發(fā)的朋友圈,自己永遠(yuǎn)是可以讀出來(lái)的,但是其他人就不一定了(因?yàn)槿绻袌D片的話(huà),還需要去調(diào)用另外一個(gè)進(jìn)程上傳圖片,然后在那個(gè)進(jìn)程將status改為2)
那么還有最后一個(gè)關(guān)鍵點(diǎn),就是負(fù)責(zé)上傳圖片的那個(gè)進(jìn)程(upload.php),這個(gè)是真實(shí)上傳圖片的邏輯,
有幾張圖片,這么upload.php就會(huì)被調(diào)用幾次
每次上傳成功后將圖片行的字段status改成2
upload.php
<?php
//Code..
//把圖片上傳到服務(wù)器目錄
//獲取長(zhǎng)傳結(jié)果標(biāo)識(shí),更改狀態(tài)
If(上傳成功){
//將status改回2
$status_data = array("status" => 2);
DI()->notorm->pic->select('u_id')->where('u_id, $u_id)-->update($status_data);
}else{
Code…
}
經(jīng)過(guò)以上的幾個(gè)操作(首先是publish.php,如果有圖片上傳的話(huà)則調(diào)用upload.php,展示的時(shí)候是list.php)。
不知道大家看出門(mén)道沒(méi)有,和我們平常寫(xiě)的發(fā)布功能不同的是,上傳upload.php功能被獨(dú)立出來(lái)了,改裝后的發(fā)布publish.php會(huì)用最快的速度將你的文本內(nèi)容存進(jìn)數(shù)據(jù)庫(kù),并且如果有圖片內(nèi)容的話(huà),他會(huì)單獨(dú)調(diào)用上傳API upload.php。
最關(guān)鍵的是在顯示的時(shí)候做了一些小技巧,讓自己保證可以看到自己發(fā)的東西。
好了,以上就是本文的全部?jī)?nèi)容了,希望對(duì)大家學(xué)習(xí)PHP有所幫助,也請(qǐng)大家繼續(xù)關(guān)注腳本之家。
- PHP+JS實(shí)現(xiàn)的商品秒殺倒計(jì)時(shí)用法示例
- php倒計(jì)時(shí)出現(xiàn)-0情況的解決方法
- php實(shí)現(xiàn)倒計(jì)時(shí)效果
- php+js實(shí)現(xiàn)倒計(jì)時(shí)功能
- PHP 類(lèi)商品秒殺計(jì)時(shí)實(shí)現(xiàn)代碼
- php結(jié)合redis實(shí)現(xiàn)高并發(fā)下的搶購(gòu)、秒殺功能的實(shí)例
- php解決搶購(gòu)秒殺抽獎(jiǎng)等大流量并發(fā)入庫(kù)導(dǎo)致的庫(kù)存負(fù)數(shù)的問(wèn)題
- php 計(jì)算兩個(gè)時(shí)間相差的天數(shù)、小時(shí)數(shù)、分鐘數(shù)、秒數(shù)詳解及實(shí)例代碼
- PHP獲取指定時(shí)間段之間的 年,月,天,時(shí),分,秒
- 時(shí)間戳與時(shí)間相互轉(zhuǎn)換(php .net精確到毫秒)
- PHP獲取毫秒級(jí)時(shí)間戳的方法
- php獲取當(dāng)前時(shí)間的毫秒數(shù)的方法
- php實(shí)時(shí)倒計(jì)時(shí)功能實(shí)現(xiàn)方法詳解
相關(guān)文章
Redis在Laravel項(xiàng)目中的應(yīng)用實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于Redis在Laravel項(xiàng)目中應(yīng)用的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用laravel具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-08-08
AMFPHP php遠(yuǎn)程調(diào)用(RPC, Remote Procedure Call)工具 快速入門(mén)教程
AMFPHP是PHP的遠(yuǎn)程調(diào)用(RPC, Remote Procedure Call)工具。2010-05-05
重新認(rèn)識(shí)php array_merge函數(shù)
PHP中合并數(shù)組分成兩種情況:1.如果這兩個(gè)數(shù)組中有相同的字符串鍵名 2.如果這兩個(gè)數(shù)組中有相同的數(shù)值鍵名2014-08-08
Laravel 集成微信用戶(hù)登錄和綁定的實(shí)現(xiàn)
這篇文章主要介紹了Laravel 集成微信用戶(hù)登錄和綁定的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-12-12
PHP在線(xiàn)生成二維碼代碼(google api)
通過(guò)google在線(xiàn)生成二維碼的api在線(xiàn)生成二維碼,需要的朋友可以參考下2013-06-06
PHP實(shí)現(xiàn)QQ、微信和支付寶三合一收款碼實(shí)例代碼
這篇文章主要給大家介紹了關(guān)于利用PHP如何實(shí)現(xiàn)QQ、微信和支付寶三合一收款碼的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-02-02
使用pthreads實(shí)現(xiàn)真正的PHP多線(xiàn)程(需PHP5.3以上版本)
PHP 5.3 以上版本,使用pthreads PHP擴(kuò)展,可以使PHP真正地支持多線(xiàn)程。多線(xiàn)程在處理重復(fù)性的循環(huán)任務(wù),能夠大大縮短程序執(zhí)行時(shí)間2014-05-05

