首頁  >  文章  >  後端開發  >  PHP開發高可用高安全app後端學習筆記

PHP開發高可用高安全app後端學習筆記

不言
不言原創
2018-04-08 09:33:535185瀏覽

這篇文章給大家分享的是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開發安全問題

##PHP發展Session原理以及使用詳解

#

以上是PHP開發高可用高安全app後端學習筆記的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn