php如何?APP的秒發功能

來源:互聯網
上載者:User
php如何?APP的秒發功能?很多社交軟體都是用了一種秒發機制,讓使用者的體檢感很好,今天我們也來談談這些社交軟體中常用的小技巧。希望對大家有所協助。

前言

想象一下,我們平常發朋友圈的時候,N張圖片配上文字,嗖的一下就發出去了,不帶任何拖泥帶水的那種,體驗感覺好爽~。

但是我們停下來用技術手段思考一下,這可能嗎?有些2G網路最多也就幾十K網速,我們的圖片隨便一張都幾M,即使壓縮過也有幾百K,怎麼可能瞬間發出訊息呢?

現在想想,是不是有些詭異呢~

其實吧,眾多社交軟體(微博,)都是用了一種秒發機制。他並不是真的先去發送然後發送完畢再告訴你發送成功,而是直接告訴你發送成功,然後後台再偷偷去上傳你發的東西,所以在網速不好的時候我們會經常發現一個現象,剛開始發出的朋友圈剛開始很正常,但是過了幾分鐘後,提示我們發送失敗!這很很尷尬啊,明明剛開始你什麼也沒說啊,到了最關鍵的時候你告訴我不行了..

不要被高大上的技術嚇到了,無非就是做了一些小技巧而已,真的很基礎,但是也真的很實用。

在討論技術前首先聲明一些初始條件。

1.對資料庫表結構進行了一些特殊改造: 朋友圈內容表有一個特殊的欄位status, status值有兩種情況,值可以為1或者2,
值為1是朋友圈未發布。 值為2是朋友圈發行。 (暫時看不懂為什麼這樣做的同學,可以先繼續閱讀,後面會講解)

2.此篇文章的秒發功能指的有圖片的情況下使用,因為有圖片的話,圖片上傳太慢,所以需要採用秒發機制,但是沒有圖片純文字的話,就沒太大的必要了,因為文本傳輸量很低,按照正常流程發送即可。

3.此篇文章的代碼是基於PhalApi架構,文法都比較簡單,有過ORM操作經驗的同學應該都看得懂

4.此篇文章主要講解APP的秒發功能,WEB端不是特別需要這個功能,因為現代網路足以我們的PC一次性發送很多很多張圖片(10M/s,20M/s)

大方向討論一下整個執行流程:

用戶端調用發布API,服務端進行發布內容(publish.php),如果是有圖片,那麼用戶端還要額外調用一個上傳API(upload.php),在這個上傳API(upload.php)還沒完成工作的時候,用戶端會直接告訴你發布成功(其實當前是沒有上傳完成,後面有一個進程在拚命幫你上傳著呢),然後用戶端會把你發的文字和圖片暫時拼接好顯示給你看(當前只有你能看到,你朋友圈其他人是看不到的),然後等待著上傳API(upload.php)的結果/當然也可能上傳逾時(通常一分鐘內會出結果),如果成功的話則順利上傳,失敗的話則報發送失敗,但是在等待結果的一分鐘之內,他會先讓你覺得你已經發送了,除非上傳失敗,才會在後來提醒你。

那麼讓我們在技術層面來分析一下這套機制吧:

當我們點上右上方的發送鍵後,有兩個進程在同時啟動,其中一個進程是幫你上傳文本並且告訴你已經發送成功啦(publish.php),另外一個進程是偷偷去上傳你發的圖片(upload.php),具體代碼如下:

Publish.php

<?php //正常擷取資料(文本,圖片,位置資訊等) … Code … Code … //進行判斷,如果有圖片則為未發布(status為1),無圖片則為立即發布(status為2) //如果有圖片則通過返回標識符告訴用戶端,讓他趕緊去調用真實的上傳邏輯upload.php,我們這隻把最基本的文本上傳好,再設定多一個status而已~ $status = ($pic_num > 0) ? 1 : 2; //拼接入庫資料 $where_data = array( "status"=> $status) //資料入庫 DI()->notorm-> friends ->insert($where_data); ?>

看出玄妙了嗎?我們對入庫的status欄位進行了一次判斷,分別會有1(未發布)和2(發行)兩種情況,那麼在讀取資料的時候我們應該怎麼做呢(list.php)?

那麼展示頁面就是這樣:

Lists.php


<?php //code .. //擷取文字資訊 Code.. //擷取圖片資訊//(它在擷取目前使用者pic表內的f_id(即擷取朋友圈圖片),最關鍵的地方是where條件$data= DI()->notorm->pic->select('f_id')->where("status > 1 OR (status = 1 && u_id = {$u_id})")->->fetchAll();  //code .. ?>

此處的where條件是秒發機制的最關鍵的地方:

status大於1(已發表)或者等於1(未發布),(tipsstatus在有圖片的情況下預設值為1)但是屬於目前使用者發布的內容,都可以讀出來,這就有一個很奇妙的現象,就是無論如何,我們自己發的朋友圈,自己永遠是可以讀出來的,但是其他人就不一定了(因為如果有圖片的話,還需要去調用另外一個進程上傳圖片,然後在那個進程將status改為2)

那麼還有最後一個關鍵點,就是負責上傳圖片的那個進程(upload.php),這個是真實上傳圖片的邏輯,

有幾張圖片,這麼upload.php就會被調用幾次

每次上傳成功後將圖片行的欄位status改成2

upload.php

<?php //Code.. //把圖片上傳到伺服器目錄 //擷取長傳結果標識,更改狀態 If(上傳成功){ //將status改回2 $status_data = array("status" => 2); DI()->notorm->pic->select('u_id')->where('u_id, $u_id)-->update($status_data); }else{ Code… }

經過以上的幾個操作(首先是publish.php,如果有圖片上傳的話則調用upload.php,展示的時候是list.php)。

不知道大家看出門道沒有,和我們平常寫的發布功能不同的是,上傳upload.php功能被獨立出來了,改裝後的發布publish.php會用最快的速度將你的常值內容存進資料庫,並且如果有圖片內容的話,他會單獨調用上傳API upload.php

最關鍵的是在顯示的時候做了一些小技巧,讓自己保證可以看到自己發的東西。

相關推薦:

laravel編寫APP介面(API)

PHP之Reflection API詳解

phalapi之如何?資料庫讀寫分離

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.