這篇文章給大家分享的是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 裝置機型# 設備id
type 例外型別
Description 說明
Line 出錯的行數
create_time 建立時間
#p22p#sdp#統計數據,如:友盟統計
7、APP訊息推送服務解決方案
輪詢法:APP定時向服務端發送http請求是否有訊息第三方平台:服務端->第三方平台->app
相關推薦:
以上是PHP開發高可用高安全app後端學習筆記的詳細內容。更多資訊請關注PHP中文網其他相關文章!