## RSA密文過長加密解密 越過1024的解決代碼
> 什么是RSA加密?
[RSA ](https://en.wikipedia.org/wiki/RSA)(詳見維基百科)算法是現今使用最廣泛的公鑰密碼算法,也是號稱地球上最安全的加密算法,與 md5 和 sha1 不同,到目前為止,也只有極短的RSA加密被破解。
> 使用場景
* 為移動端(IOS,安卓)編寫 API 接口
* 進行支付、真實信息驗證等安全性需求較高的通信
* 與其他第三方或合作伙伴進行重要的數據傳輸,用于外部商戶系統和本系統之間報文的安全性驗證。
> 生成私鑰、公鑰
**1、生成原始 RSA 私鑰文件**
```
openssl genrsa -out private_key.pem 1024
```
說明:生成RSA私鑰,`private_key.pem` 為存放私鑰的文件名,長度1204
**2、將原始 RSA 私鑰轉換為 pkcs8 格式**
```
openssl pkcs8 -topk8 -inform PEM -in private_key.pem -outform PEM -nocrypt -out rsa_private_key.pem
```
說明:把RSA私鑰轉換成PKCS8格式,轉化后的私鑰 `rsa_private_key.pem`
**3、生成 RSA 公鑰**
```
openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
```
說明:生成RSA公鑰文件` rsa_public_key.pem`
**4、最后會有三個文件**
```
λ ls
private_key.pem rsa_private_key.pem rsa_public_key.pem
```
文本打開`rsa_private_key.pem`、`rsa_public_key.pem`,里面存放的是私鑰、公鑰。商戶需要把公鑰字符串發給易付寶的業務人員,私鑰商戶自行保存。
[php-rsa 加密解密](https://segmentfault.com/a/1190000012083428)
Rsa 服務器類庫
```
<?php
/**.-------------------------------------------------------------------------------------------------------------------
* | Github: https://github.com/Tinywan
* | Blog: http://www.cnblogs.com/Tinywan
* |--------------------------------------------------------------------------------------------------------------------
* | Author: Tinywan(ShaoBo Wan)
* | DateTime: 2018/8/30 22:48
* | Mail: 756684177@qq.com
* | Desc: php-rsa 加密解密 https://segmentfault.com/a/1190000012083428
* '------------------------------------------------------------------------------------------------------------------*/
namespace app\common\library;
class Rsa
{
/**
* @var array 默認配置
*/
private $_config = [
'public_key' => '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbtLA7lMfUvpBgfgzouiPgcnbL
DnEcuCK0gMub/EAEqmr82sl+9tH1iQb1w/hgQLptVRxAuUOa03XqlnG3wkAegtQt
4Q5ZtHSSomE8/5FXJvQfGTCz5RARyM0MiLTMZJGhLdVT6O8uCYIrPRQq7u6NVLs9
6YDmtzX2do/sTsWCAwIDAQAB
-----END PUBLIC KEY-----',
'private_key' => '-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCbtLA7lMfUvpBgfgzouiPgcnbLDnEcuCK0gMub/EAEqmr82sl+
9tH1iQb1w/hgQLptVRxAuUOa03XqlnG3wkAegtQt4Q5ZtHSSomE8/5FXJvQfGTCz
5RARyM0MiLTMZJGhLdVT6O8uCYIrPRQq7u6NVLs96YDmtzX2do/sTsWCAwIDAQAB
AoGAfnO3zCuAPp6k0jiMc1T4XgeXwkDwS8qfJMiUkxHBTAi66q8khSAeU7H9HQsS
Y9ktji1YzJeo98xULzgPEpWHS/uhA8VZa16TLy9Yfadn2t+wpWpEJ9ZA4jjEqfQj
DDxcUc/pEv5siaE/bU8uls4o2nAiuWnI2n5FGrQa2OziGUECQQDPOh3KD2AOZtEF
p7i0yxYXe4dCKwenfw5q7l933RgqMXsVR1EAGzAUdIs71hTye6ibhva+eJRfndoV
Jq2IHjOdAkEAwFpOZR8j3Cl4zEk/9D9WEnSa8VWLe76vb7DfgfwkSAhs/f2MNF1I
zy9W5tPHRiMzaHNgPBFX9tw2u5QzsgOqHwJAPl3zUTjHZA41okoUIPVuNKsMzjE9
IH/wyuXq/ZwhBbHWpVTNYAbOtZlNvjh0HXZyDDzWTgTkQtKzK+J0H59XUQJARukD
vYOdVKx1O9pFGWW/9U3HUPCYWyYQxrwNqX2qYmO4ymmOJj+9d6OcBbxM2i5f5UGj
WIGMTBUimEQqSpXPQQJAIkHC2GknUv8HaBRLXxYTIAjj78a0pQT2bYlI6R04AwUZ
ljBaUGvvdYJ3CGZ32Xk12Te2fMJj5h/yLyEr8uzpzw==
-----END RSA PRIVATE KEY-----',
];
/**
* 構造函數
* Rsa constructor.
* @param $private_key_filepath
* @param $public_key_filepath
*/
public function __construct($private_key_filepath = null, $public_key_filepath = null)
{
if(!empty($private_key_filepath) && !empty($public_key_filepath)){
$this->_config['private_key'] = $this->_getContents($private_key_filepath);
$this->_config['public_key'] = $this->_getContents($public_key_filepath);
}
}
/**
* @uses 獲取文件內容
* @param $file_path string
* @return bool|string
*/
private function _getContents($file_path)
{
file_exists($file_path) or die ('密鑰或公鑰的文件路徑錯誤');
return file_get_contents($file_path);
}
/**
* @uses 獲取私鑰
* @return bool|resource
*/
private function _getPrivateKey()
{
$private_key = $this->_config['private_key'];
return openssl_pkey_get_private($private_key);
}
/**
* @uses 獲取公鑰
* @return bool|resource
*/
private function _getPublicKey()
{
$public_key = $this->_config['public_key'];
return openssl_pkey_get_public($public_key);
}
/**
* 私鑰加密 (使用公鑰解密)
* @param string $data
* @return null|string
*/
public function privateEncrypt($data = '', $padding = OPENSSL_PKCS1_PADDING)
{
if (!is_string($data)) return null;
$encrypted = '';
$chunks = str_split($data, 117);
foreach ($chunks as $chunk) {
$partialEncrypted = '';
$encryptionOk = openssl_private_encrypt($chunk, $partialEncrypted, $this->_getPrivateKey(), $padding);
if ($encryptionOk === false) {
return null;
}
$encrypted .= $partialEncrypted;
}
$encrypted = base64_encode($encrypted);
return $encrypted;
}
/**
* 公鑰加密(使用私鑰解密)
* @param string $data 加密字符串
* @param int $padding
* @return null|string
*/
public function publicEncrypt($data = '', $padding = OPENSSL_PKCS1_PADDING)
{
if (!is_string($data)) return null;
$encrypted = '';
$chunks = str_split($data, 117);
foreach ($chunks as $chunk) {
$partialEncrypted = '';
$encryptionOk = openssl_public_encrypt($chunk, $partialEncrypted, $this->_getPublicKey(), $padding);
if ($encryptionOk === false) {
return null;
}
$encrypted .= $partialEncrypted;
}
$encrypted = base64_encode($encrypted);
return $encrypted;
}
/**
* @uses 私鑰解密 (使用公鑰加密)
* @param string $encrypted
* @return null
*/
public function privateDecrypt($encrypted = '')
{
if (!is_string($encrypted)) return null;
$decrypted = '';
$chunks = str_split(base64_decode($encrypted), 128);
foreach ($chunks as $chunk) {
$partial = '';
$decryptIsTrue = openssl_private_decrypt($chunk, $partial, $this->_getPrivateKey());
if ($decryptIsTrue === false) {
return null;
}
$decrypted .= $partial;
}
return $decrypted;
}
/**
* 公鑰解密 (使用私鑰解密)
* @param string $encrypted 被解密字符串
* @return null
*/
public function publicDecrypt($encrypted = '')
{
if (!is_string($encrypted)) return null;
$decrypted = '';
$chunks = str_split(base64_decode($encrypted), 128);
foreach ($chunks as $chunk) {
$partial = '';
$decryptIsTrue = openssl_public_decrypt($chunk, $partial, $this->_getPublicKey());
if ($decryptIsTrue === false) {
return null;
}
$decrypted .= $partial;
}
return $decrypted;
}
/**
* 私鑰驗簽
* @param $data string 驗簽內容
* @param $signature string 簽名字符串
* @param int $signature_alg
* @return bool
*/
public function privateSign($data, $signature, $signature_alg = OPENSSL_ALGO_SHA1)
{
$result = openssl_sign($data, base64_decode($signature), $this->_getPrivateKey(), $signature_alg);
openssl_free_key($this->_getPrivateKey());
return $result === 1 ? true : false;
}
/**
* 公鑰驗簽
* @param $data string 驗簽內容
* @param $signature string 簽名字符串
* @param int $signature_alg
* @return bool
*/
public function publicSign($data, $signature, $signature_alg = OPENSSL_ALGO_SHA1)
{
$result = openssl_verify($data, base64_decode($signature), $this->_getPublicKey(), $signature_alg);
openssl_free_key($this->_getPublicKey());
return $result === 1 ? true : false;
}
}
```
> 使用案例
* 公鑰加密、私鑰解密
```
$rsa = new Rsa();
// 加密明文
$crypt_text = '公鑰加密、私鑰解密';
echo '加密明文:' . $crypt_text.PHP_EOL;
$public_encrypt_data = $rsa->publicEncrypt($crypt_text);
echo '公鑰加密后數據:' . $public_encrypt_data.PHP_EOL; // 一直在變化
$private_decrypt_data = $rsa->privateDecrypt($public_encrypt_data);
echo '私鑰解密數據: ' . $private_decrypt_data.PHP_EOL;
```
>加密明文:公鑰加密、私鑰解密
>>公鑰加密后數據:QHdj15P6l1gJbjNlD7spKT7KjCJJ0Qg5c8JjLBAS9hvhkq8eRuaNY/dDrboD3t40NvyPI8SBFBkDTjJ5IDyqTTSfthUROvasMD7wCPRYGaOt5to+ygfvV5t4CyYQEvSSflqimWvffRs0L8fs3pqE2kLD/AHOC94+ZBNFfzTTtVA=
>>>私鑰解密數據: 公鑰加密、私鑰解密
* 私鑰加密、公鑰解密
```
$rsa = new Rsa();
// 加密明文
$crypt_text = '私鑰加密、公鑰解密';
echo '加密明文:' . $crypt_text.PHP_EOL;
$private_encrypt_data = $rsa->privateEncrypt($crypt_text);
echo '私鑰加密后數據:' . $private_encrypt_data..PHP_EOL; // 不變
$public_decrypt_data = $rsa->publicDecrypt($private_encrypt_data);
echo '公鑰解密數據: ' . $public_decrypt_data..PHP_EOL;
```
> 加密明文:私鑰加密、公鑰解密
>>私鑰加密后數據:dDzAs7kj9z7kS7Zbcz6sNLP+sIOnXp2qFGr4RepZcZp9XzCt8Tt+Kd/NIo4S20hjAvBiurvSHaR6LLL5ur5dc4vkFGkV+bGaT2SlhC4JkvYt4N2T9EiQupwcCtlk+dcENLexWiCvZtuzk3peK+H7AUWqFeOlmGRZb3De7bP+heY=
>>>公鑰解密數據: 私鑰加密、公鑰解密
* 測試結果:`私鑰加密`是不變的,`公鑰加密`后的字符串一直是變化的
> 經歷
二流院校,計算機工科男
> 常用ID
Tinywan
> 主頁
[https://www.tinywan.com](https://www.tinywan.com/
)
> GitHub:
[https://github.com/Tinywan
](https://github.com/Tinywan
)
>博客園地址
[http://www.cnblogs.com/Tinywan](http://www.cnblogs.com/Tinywan)
- 序言
- 專題零 PHP基礎
- 1、線程安全與非線程(NTS)安全版本的區別
- 2、JWT認證
- 3、數組
- 專題一 Nginx 實踐教程
- 1、什么是Nginx?
- 2、Nginx 特性和編譯安裝
- 3、日志配置和模塊講解
- 4、靜態資源和緩存服務
- 5、正向和反向服務
- 6、七層和四層負載均衡
- HTTP負載均衡(七層)
- TCP負載均衡(四層)
- 阿里云負載均衡配置
- 7、Rewrite規則
- 8、如何配置HTTPS服務
- 9、高級模塊(RTMP)
- (1)nginx-vod-module 模塊
- 10、Nginx與Lua開發(Openresty介紹)
- 11、性能優化和常見問題
- 12、什么Openresty以及Openresty擴展模塊學習
- 13、實踐案例
- (1)限流模塊
- (2)詳解:Nginx 反向代理、后端檢測模塊
- 14、如何做一個systemctl服務
- (1)Centos
- 15、agentzh 的 Nginx 教程
- 16、Openresty-Lua動態修改upstream后端服務
- 17、16點搞定高性能web服務器
- 18、如何配置proxy_cache模塊
- 1、微信打開https頁面顯示空白解決記錄
- 19、在線 Nginx 配置生成器
- 20、Nginx的負載均衡算法
- 1、加權輪詢理論
- 專題二 流媒體系統
- 1、什么是視頻直播?
- 2、如何使用推流軟件OBS?
- 3、基于Nginx 的RTMP模塊搭建系統
- 4、直播流程
- 5、典型業務場景
- 6、解決方案架構
- 7、編寫Shell腳本上傳直播回顧到阿里云OSS存儲
- 8、直播回調授權觀看
- 9、視頻直播源如何加密
- 10、如何實現視頻在線云剪輯
- 11、視頻點播以及加密技術實現
- 12、FFmpeg使用
- 13、播放器
- 14、其他問題
- 15、HLS 直播加密播放
- 16、nginx-vod-module 模塊
- 17、車輛維修直播系統
- 專題三 Redis 數據庫
- 1、編譯安裝
- 2、配置詳解
- 3、基礎知識
- 4、Redis 執行Lua腳本基本用法
- 5、Redis 漏洞如何防止被黑客攻擊
- 6、使用場景
- 7、如何在Ubuntu 16.04上安裝和配置Redis
- 8、Redis實現分布式鎖(集群版)
- 9、Redis鍵空間通知
- 1strace 調試
- 10、Redis5.0 搭建Cluster集群
- 1、創建和使用Redis群集
- 2、新增節點
- 11、基于Redis的限流器的實現
- 12、Redis5.0 新特性
- 1、新的Stream類型
- 附錄一 常見問題
- 專題四 Shell 腳本
- 1、編寫快速安全Bash腳本的建議
- 2、寫好shell腳本的13個技巧
- 3、shell腳本實現分日志級別記錄日志
- 4、Nginx日志定時備份和刪除
- 5、SHELL腳本小技巧
- 6、Mysql 自動備份腳本安全加鎖機制
- 7、PHP和Shell 腳本如何很好的搭配
- 8、Shell 腳本判斷Redis鍵值是否是一個正整數
- 專題五 ThinkPHP5 框架
- 1、如何使用命令行(帶參數)
- 2、如何使用多任務隊列
- 3、緩存支持文件緩存和Redis緩存
- 4、通過redis實現session共享存儲 (不需要修改php.ini配置文件)
- 5、符合REST架構設計的API,提供便利的API的版本號訪問地址
- 6、引入Trait,實現了代碼的復用
- 7、結合GatewayWorker實現簡單的聊天功能
- 8、PHPExcel與ajax結合進行文件異步下載
- 9、phpspreadsheet 導出文件支持Excel、Csv、Html格式導出
- 10、讀取 Excel 上傳文件后批量導入MySQL數據庫
- 11、支付寶沙箱模式支付(無需商戶賬號)
- 12、自定義日志(模塊分類)和 socketlog-server服務
- 13、如何實現數據庫自定義自增字段實現,方法
- 14、分布式之延時任務方案解析
- (1)生成訂單60秒后,給用戶發短信
- (2)延遲自動取消訂單
- 15、Repository 模式實現業務邏輯和數據訪問的分離
- 16、命令行守護進程
- 17、如何自定義異常類
- (1)Exception 類
- (2)系統異常處理
- (3)自定義異常類
- (4)自定義異常類處理類
- (6)全局異常類處理
- 18、阿里云專題
- (1)如何使用短信SDK
- (2)OSS擴展使用
- 19、命令行
- 20、容器專題
- 21、緩存
- (1)緩存自動更新
- 22、日志
- (1)錯誤日志郵件通知
- (2)日志參數介紹
- 23、經典案例
- 1、API開發實現自動校驗參數
- 24、升級坑記錄
- 25、生產環境部署
- 1、開啟緩存
- 專題六 MySQL數據庫
- 1、安裝與配置
- 2、索引
- 3、字符集
- 4、導出導入數據
- 5、5.7版本兼容性
- 6、數據庫自動備份
- 7、優化
- 8、數據庫設計規范
- 附錄一 常用語句
- 附錄二 MySQL實戰45講
- 1、常用語解釋
- 專題七 PHP異常處理
- 第一章 Exception
- 第二章 系統異常處理
- 第三章 自定義異常類
- 第四章 自定義異常類處理類
- 第五章 日志
- 第六章 全局異常類處理
- 專題八 常用整理
- 第一章、Linux 命令
- 第二章、Google 擴展
- 第三章、frp內網穿透
- 【進階一】做成一個服務
- 【進階二】代理一個Websocket 服務
- 【進階三】代理N個Web服務
- 附錄一 Docker-compose 配置
- 第四章、如何美化文檔
- 第五章 如何提高訪問github的速度
- 第六章 Vultr搭建SS教程
- 第七章 VS code 環境配置
- 第八章、Ngrok
- 第十章 PHP7新特性
- 第十一章 PPH編譯安裝
- 第十二章 使用systemd管理workerman
- 第十三章 yaconf
- 第十四章 Supervisor進程管理工具
- 第十五章 常用工具列表
- 1、免費IP地址庫
- 第十六章 Ubuntu rc.local systemd設置
- 第十七章 技術人員擴展Web應用程序
- 附錄一 、Highcharts Ajax異步加載
- 附錄二 laydate詳細示例
- 第十八章 Redis配置Cookie模擬session登錄
- 專題九 PHP函數
- (1)系統函數
- (2)自定義函數
- (3)回調函數
- (4)匿名函數
- (5)遞歸函數
- (6)常用函數庫
- (7)call_user_func函數
- 專題十 問題誤區
- 1 - 跨域問題
- 2 - PHP 面試總結
- 3、PHP算法
- 4、MySQL基礎知識
- 5、面試總結
- 6、empty、isset、is_null的用法和區別
- 7、PHP常用函數整理
- 8、Git 注意要點
- 1、git 解決每次更新代碼都要輸入用戶名密碼
- 2、git stash和git stash pop
- 3、分支(OEM管理)
- 4、推送本地分支到遠程分支
- 5、Git分支模型
- 9、PHP常見誤區
- 10、shell 腳本
- 11、Http 狀態嗎
- 12、日期、時間
- 13、it set 'X-Frame-Options' to 'DENY'
- 14、一次Redis內存占用很高
- 15、項目composer.lock 文件是否需要版本控制
- 專題十一 支付
- 一、return_url和notify_url的區別
- 二、匯付寶網關
- 三、PV、UV、IP 區別
- 四、支付結算周期
- 五、ngrok
- 六、轉賬
- 七、支付寶
- 1、當面付
- (1)條碼支付和掃碼支付介紹
- (2)接口申請
- (3)生成RSA密鑰
- (4)SDK集成與密鑰配置
- (5)掃碼支付接入
- 2、常見錯誤信息
- 3、商家服務
- 4、企業支付
- 5、第三方應用
- 6、服務商接入
- 7、訂單查詢
- 8、新轉賬鏈接來生成收款碼
- 9、銀行卡轉賬
- 八、三方渠道
- 九、結算
- 十、在線支付平臺的實現
- 1、支付平臺的接入
- 2、支付請求、支付結果返回的傳輸安全
- 3、支付站點、商戶站點、銀行網關的交互
- 4、支付狀態不同步的處理
- 5、支付方案
- (1)銀行對接方案
- 十一、在線支付平臺支付接口的設計
- 1、支付接口
- (1)支付請求參數
- (2)支付返回參數
- 2、退款接口
- 3、查詢接口
- 遇到的坑
- 1、異步和主查詢遇到的問題
- 2、一次沒有記錄的訂單是如何代付成功的?
- 十二、個人免簽支付
- 專題十二 安全
- 1、SQL注入
- 2、XSS攻擊
- 3、會話固定
- 4、會議捕獲和劫持
- 5、跨站點請求偽造(CSRF)
- 6、代碼注入
- 7、RSA 加密解密
- 8、PHP處理密碼的幾種方式
- 9、安全建議
- 10、Shell腳本加密工具——Shc
- 12、DDos攻擊
- 11、RSA 1024和AES 256
- (1)RSA加密傳輸代碼示例
- (2) 支付Demo
- 附錄一 一次阿里云被Doss
- 專題十三 消息中間件(MQ)
- 消息一、NSQ
- 消息二、分布式之消息隊列
- 1、為什么要使用消息隊列 ?
- 消息三、RabbitMQ
- 4、消息確認機制
- 1、 簡單隊列 hello world
- 專題十四 Docker
- 第一部分 Docker安裝
- 第二部分 如何在本地構建鏡像
- 第三部分 鏡像、容器以及命令操作
- 1、進入容器的4種方式
- 第四部分 Dockerfile指令介紹
- 第五部分 發布自己的鏡像
- 第六部分 數據卷管理
- 第七部分 Docker-compose
- 1、Docker-Compose入門基礎
- 2、構建自己的docker-compose配置
- 第八部分 Docker網絡
- 第九部分 搭建私有倉庫
- 第十部分 Docker部署方式
- 第十一部分 Swarm集群
- 1、Swarm介紹
- 2、Swarm集群部署與管理
- 1、命令列表
- 2、創建集群
- 3、為swarm添加節點
- 3、集群服務管理
- 1、部署服務
- 2、檢查服務
- 3、擴展服務
- 4、刪除服務
- 5、更新服務
- 6、清空節點
- 4、管理應用程序數據(數據持久化)
- 5、集群服務發布
- 6、服務發現與負載均衡(上)
- 7、服務發現與負載均衡(下)
- 8、高可用架構
- 9、服務配置文件管理
- 10、集群部署LNMP網站平臺實戰
- 附錄一 基礎
- 附錄二 常見錯誤問題
- 1、設置時區時間
- 附錄三 阿里云部署記錄
- 附錄四 Ubuntu 18.04換國內源
- 附錄五 常見文件精粹
- 附錄六 Kong
- 附錄七 PHPStrom 調試XDebug
- 附錄八 Docker和PHP
- 附錄九 安裝RabbitMQ
- 1、使用場景
- 2、簡單隊列
- 3、交換機模式
- 4、插件安裝
- 專題十五 Git版本管理
- 1、Git基礎命令
- 2、團隊Git 分支模型
- 3、緩存&撤銷
- 4、儲藏與清理
- 5、生成SSH公鑰
- 6、配置 Git
- 附錄一 常見誤區
- 附錄二、如何同步Fork
- 附錄三 通過烏龜查看歷史記錄
- 附錄四 多Git賬戶id_rsa私鑰
- 專題十六 WorkerMan
- 1、Worker類的使用
- 2、AsyncTcpConnection類
- 3、SocketIO消息推送
- 4、ThinkPHP5.1使用
- 附錄一 使用systemd管理workerman
- 專題十七 Jenkins
- 1、Jenkins安裝
- 2、Pipeline插件
- 3、BlueOcean
- 附錄一 常見錯誤
- 附錄二 實戰一
- 專題十八 測試專題
- API接口
- 第一章:如何調用API接口
- 第二章:如何創建推流地址
- 網絡狀態碼大全
- 測試記錄
- 筆記一:Nginx-Rtmp推流授權
- 筆記二:阿里直播推流筆記
- 筆記三:私有云直播推流筆記
- 筆記四:IM 測試記錄
- 項目功能列表
- 功能一:生成短鏈接網址
- LiveVideoStack
- 音視頻未來
- AV1
- JavaScript
- 基礎知識
- Unix/C編程
- 1、基本概念
- 2、Unix套接字
- 二、Crontab
- 1、入門教程
- 2、crontab 解決周期內未執行完重復執行
- Golang
- 一、基礎
- 二、命令行
- 自動部署持續集成
- 1、利用WebHook實現PHP自動部署Git代碼
- 2、coding托管你的Gitbook
- 3、OneinStack
- 4、利用 GitHook 構建持續交付和部署
- 并發
- 第一章、訂單并發處理
- 第二章、分布式鎖
- 設計模式
- 第一章、依賴注入
- 第二章、策略模式
- 第三章、裝飾器模式
- 第四章、Service模式
- 第五章、Repository模式
- 第六章、Presenter模式
- 創建設計模式
- 單例模式(Singleton)
- 工廠模式(Factory)
- 抽象工廠模式(AbstractFactory)
- 建造者模式(Builder)
- 原型模式(Prototype)
- 結構設計模式
- 適配器模式(Adapter)
- 橋接模式(Bridge)
- 合成模式(Composite)
- 裝飾器模式(Decorator)
- 門面模式(Facade)
- 代理模式(Proxy)
- 享元模式(Flyweight)
- 常用
- 1、編輯器
- 2、編譯安裝
- 3、生成二維碼(qr-code)
- 5、Mysql
- 4、Composer
- 6、看云美化CSS樣式
- 7 office2019激活方法
- MVC
- 第一章、MVC 框架中的路由器(Router)是如何跑起來的?
- 專題十五 區塊鏈
- 1、區塊鏈到底長什么樣?
- 面試招聘
- 專題十六 PHPstrom工具
- 附錄一 采坑記錄
- 1、 Redis錯誤 No space left on device
- 個人簡歷
- PHP高級實戰
- 1、自動加載
- ThinkPHp3.2
- 1、四種URL_MODEL模式
- 沃土