本篇文章給大家分享的是PHP開發高可用高安全app後端的學習筆記 ,有需要的朋友可以參考一下文章的內容
源碼下載地址:https://download.csdn.net/download/qq_21683643/10331534
目錄
1.安全性
2.授權碼sign演算法
3.登入情境access_user_token演算法
4.token唯一性支援
5.API一次性請求支援
6.高可用
7.Restful API
8.web登入和APP登入異同處
9.阿里大於簡訊驗證解決用戶端APP複雜登入情境
10.API介面版本解決方案
11.APP本地時間和伺服器時間一致解決方案
12.不可預知的API內部異常解決方案
13.APP版本升級方案
14.利用七牛雲解決圖片處理基礎服務能力
15.基礎類庫的封裝
16.PHP設計模式的穿透
17.部分模組提供多種解決方案最後選擇最優的方案
18.PHP和ajax的非同步資料互動
1、restful api
資料結構格式
3. HTTP狀態代碼使用TK內建的json實現
3. status 業務狀態代碼
4. message 提示資訊
5. data 資料層
通用化API介面資料封裝
function show($status, $message, $data=[], $httpCode=200) { $data = [ 'status' => $status, 'message' => $message, 'data' => $data, ]; return json($data, $httpCode);}
不可預知的內部異常api資料輸出解決方案
config配置exception_handle填寫異常類路徑
class ApiHandleException extends Handle { /** * http 狀態代碼 * @var int */ public $httpCode = 500; public function render(\Exception $e) { // 還原正常報錯,上線後為flase(服務端開發) if(config('app_debug') == true) { return parent::render($e); } if ($e instanceof ApiException) { $this->httpCode = $e->httpCode; } return show(0, $e->getMessage(), [], $this->httpCode); }}class ApiException extends Exception { public $message = ''; public $httpCode = 500; public $code = 0; /** * @param string $message * @param int $httpCode * @param int $code */ public function __construct($message = '', $httpCode = 0, $code = 0) { $this->httpCode = $httpCode; $this->message = $message; $this->code = $code; }}
2、APP-API資料安全解決方案
解決方式就是各種的加密:MD5 AES(對稱式加密) RSA(非對稱,效率較低)
sign (有效時間,唯一性)
/** * 產生每次請求的sign * @param array $data * @return string */ public static function setSign($data = []) { // 1 按欄位排序 ksort($data); // 2拼接字串資料 & $string = http_build_query($data); // 3通過aes來加密 $string = (new Aes())->encrypt($string); return $string; }/** * 檢查sign是否正常 * @param array $data * @param $data * @return boolen */ public static function checkSignPass($data) { $str = (new Aes())->decrypt($data['sign']); if(empty($str)) { return false; } // diid=xx&app_type=3 parse_str($str, $arr); if(!is_array($arr) || empty($arr['did']) || $arr['did'] != $data['did'] ) { return false; } // 有效時間:時間間隔不能超過60s if(!config('app_debug')) { if ((time() - ceil($arr['time'] / 1000)) > config('app.app_sign_time')) { return false; } //echo Cache::get($data['sign']);exit; // 唯一性判定 if (Cache::get($data['sign'])) { return false; } } return true; }/** * 檢查每次app請求的資料是否合法 */ public function checkRequestAuth() { // 首先需要擷取headers $headers = request()->header(); // todo // sign 加密需要 用戶端工程師 , 解密:服務端工程師 // 1 headers body 仿照sign 做參數的加解密 // 2 // 3 // 基礎參數校正 if(empty($headers['sign'])) { throw new ApiException('sign不存在', 400); } if(!in_array($headers['app_type'], config('app.apptypes'))) { throw new ApiException('app_type不合法', 400); } // 需要sign if(!IAuth::checkSignPass($headers)) { throw new ApiException('授權碼sign失敗', 401); } Cache::set($headers['sign'], 1, config('app.app_sign_cache_time')); // 1、檔案 2、mysql 3、redis $this->headers = $headers; }
APP和伺服器端時間一致性解決方案
解決1:擷取服務端時間,用戶端拿到服務端正確時間進行對比。
解決2:初始化app時傳輸時間戳記,用戶端時間=服務端時間戳記+差值
3、API介面文檔編寫(API入參,出參的格式)
API介面地址 請求方式 post入參格式 出參格式 http code
4、APP版本升級業務開發
表的設計
CREATE TABLE ent_version (
id int(10) unsigned NOT NULL,
app_type varchar(20) NOT NULL DEFAULT ” COMMENT ‘app類型 比如 ios android’,
version int(8) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘組建號’,
version_code varchar(20) NOT NULL DEFAULT ” COMMENT ‘外部版本號碼比如1.2.3’,
is_force tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘是否強制更新0不,1強制更新’,
apk_url varchar(255) NOT NULL DEFAULT ” COMMENT ‘apk最新地址’,
upgrade_point varchar(500) NOT NULL DEFAULT ” COMMENT ‘升級提示’,
status tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘狀態’,
create_time int(10) unsigned NOT NULL DEFAULT ‘0’,
update_time int(10) unsigned NOT NULL DEFAULT ‘0’
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
5、登入開發
1.1APP登入業務開發介紹
一般app有兩種狀態:登入態和未登入態
為什麼要做登入?挖掘使用者、互動、交流
如何做APP登入?模仿其他App登入
其他登入方式:免密手機號驗證碼、帳號密碼
第三方登入方式:qq授權、授權、微博授權
1.2App登入表結構的設計
CREATE TABLE ent_user (
id int(10) unsigned NOT NULL COMMENT ‘主鍵’,
username varchar(20) NOT NULL DEFAULT ” COMMENT ‘使用者名稱’,
password char(32) NOT NULL DEFAULT ” COMMENT ‘密碼’,
phone varchar(11) NOT NULL DEFAULT ” COMMENT ‘手機號’,
token varchar(100) NOT NULL DEFAULT ” COMMENT ‘令牌’,
time_out int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘令牌失效時間’,
image varchar(200) NOT NULL DEFAULT ” COMMENT ‘頭像’,
sex tinyint(1) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘性別0男 1女’,
signature varchar(200) NOT NULL DEFAULT ” COMMENT ‘個性簽名’,
create_time int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘註冊時間’,
update_time int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘登入時間’,
status tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘狀態是否鎖定’
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
1.3阿里大於雲通訊服務平台介紹
什麼是阿里大於
阿里大於提供了包括簡訊、語音等個人化的服務
1.4傳送簡訊驗證碼功能開發
1.5App登入token唯一性演算法
App調用登入,服務端返回加密的token資訊,每次app請求介面都需要帶token
App產生唯一的token並加密:token=token+13位時間戳記
1.6App按密碼方式登入
使用者名稱和密碼都需要加密傳輸給服務端
6、APP端異常、效能監控及定位分析
APP端異常基本情況:
Crach 在使用App的過程中突然發生閃退現象
卡頓 出現畫面的卡頓
Exception 程式出現的異常
ANR 出現提示無響應彈框(Android)
資料收集方案:
建立異常效能表,開發API介面
id 主鍵
app_type app類型
version_code 版本號碼
Model 裝置機型
Did 裝置id
type 異常類型
Description 描述
Line 出錯的行數
create_time 建立時間
成熟的解決方案:
使用第三方平台,app用戶端接入sdk即可統計資料,如:友盟統計
7、APP訊息推送服務解決方案
輪詢法:APP定時向服務端發送http請求是否有訊息
第三方平台:服務端->第三方平台->app