現(xiàn)在二維碼的用處是越來越大了酒奶,很多地方都可以見到二維碼的影子删咱,比如二維碼支付屑埋,二維碼登錄等。二維碼可以存儲信息痰滋。通過掃描可以獲取二維碼上面的信息摘能,獲取到之后就可以經(jīng)過處理加工查詢等一些操作。下面是一個二維碼掃描登錄的例子大致原理如圖所示:
1敲街、首先团搞,服務器端要生成一個二維碼在瀏覽器端輸出,這就是我們在瀏覽器上見到的二維碼多艇。這里我們生產(chǎn)一個唯一的標識符guid逻恐,為了避免登錄錯位。
2、此時瀏覽器二維碼頁面的腳本就會不停的發(fā)異步到服務器复隆,返回用戶是否登錄成功的結(jié)果拨匆。在登錄成功之前或者二維碼實現(xiàn)之前不停的發(fā)送異步。設置一分鐘二維碼失效挽拂。
3惭每、用戶登錄app,app此時有了用戶登錄過的加密信息亏栈。通過掃描二維碼獲取到唯一的guid台腥,也就是授權(quán)碼,將guid和用戶信息一起打包發(fā)送給服務器做驗證绒北。認證結(jié)果發(fā)送給前端腳本所做的請求黎侈。
4、前端如果返回認證成功那么做登陸跳轉(zhuǎn)闷游,其他做相應的處理蜓竹。
以下是過程中的遇到了一些新技術(shù),先記錄下來储藐,待學習。
1嘶是、瀏覽器及時獲取登錄钙勃,用到的輪詢技術(shù):
①、ajax異步定時輪訓請求聂喇,不停的訪問服務器辖源,會給服務器帶來不小的壓力。
②希太、Http comet實時推送克饶,這種技術(shù)雖然可達到全雙工通信,但依然需要發(fā)出請求誊辉。
③矾湃、WebSocket技術(shù),瀏覽器和服務器只需要做一個握手的動作堕澄,然后瀏覽器和服務器之間就形成了一條快速通道邀跃,兩者之間就直接可以數(shù)據(jù)互相傳送。
2蛙紫、swoole擴展解決PHP的數(shù)據(jù)庫連接池難題
PHP的數(shù)據(jù)庫連接池一直以來都是一個難題拍屑,很多從PHP語言轉(zhuǎn)向Java的項目,大多數(shù)原因都是因為Java有更好的連接池實現(xiàn)坑傅。PHP的MySQL擴展提供了長連接的API僵驰,但在PHP機器數(shù)量較多,規(guī)模較大的情況下,mysql_pconnect非但不能節(jié)約MySQL資源蒜茴,反而會加劇數(shù)據(jù)庫的負荷星爪。
假設有100臺PHP的應用服務器,每個機器需要啟動100個apache或fpm工作進程矮男,那每個進程都會產(chǎn)生一個長連接到MySQL移必。這一共會產(chǎn)生1萬個My SQL連接。大家都知道MySQL是每個連接會占用1個線程毡鉴。那MYSQL就需要創(chuàng)建1萬個線程崔泵,這樣大量的系統(tǒng)資源被浪費在線程間上下文切換上。而你的業(yè)務代碼中并不是所有地方都在做數(shù)據(jù)庫操作猪瞬,所以這個就是浪費的憎瘸。
連接池就不同了,100個worker進程陈瘦,公用10個數(shù)據(jù)庫連接即可幌甘,當操作完數(shù)據(jù)庫后,立即釋放資源給其他worker進程痊项。這樣就算有100臺PHP的服務器锅风,那也只會創(chuàng)建1000個MySQL的連接,完全可以接受的鞍泉。
3皱埠、Workerman框架,可以保持長連接