極其精簡的PHP框架WJW
最近在做一個專案,使用PHP做後端服務,為了提升程式碼執行效率,自己寫了這個極其精簡的PHP框架,我把它命令為WJW,我的姓名的縮寫
框架中包含連線多個資料庫的實現、連線多個redis的實現,和自動載入呼叫到的類檔案。目標是做到儘量少得執行程式碼、儘量少得載入檔案。
config.php程式碼如下:
/public/demo.php 程式碼如下:
/helper/helper_demo.php 程式碼如下:
框架中包含連線多個資料庫的實現、連線多個redis的實現,和自動載入呼叫到的類檔案。目標是做到儘量少得執行程式碼、儘量少得載入檔案。
- 框架僅支援PDO連線資料庫,不做多種資料庫的支援,也不做多種連線方式的支援;
- 框架中運算元據庫的方式和操作redis的方式都使用原生的方法,沒有封裝更多層程式碼,用於減少程式碼的執行路徑;
- WJW框架建議把所有可能的自定義類都放到helper目錄中,包括類庫、Model類、service類等等,用於減少使用類檔案時的目錄判斷和框架的程式碼量,開發者可以通過使用類檔案的命令規則區分不同種類的檔案;
- WJW框架建議在每一次請求中都儘量少得載入檔案、儘量短的程式碼執行路徑,因為開發者在組織程式碼結構時也需要往這個方向靠攏,才能開發出更加極速高效的系統。
目錄和檔案結構:
helper/ Model類、service類等等類庫的存放目錄,類檔案的檔名和類名需要一致,
在專案中無需手工例項化類,可以直接使用$app->your_class_name->your_method_name(); 訪問。
------helper_demo.php 這是一個類庫的示例檔案,可以刪除
public/ 伺服器中配置虛擬主機時,根目錄指向此目錄,此目錄是對外訪問的入口
------demo.php 這是一個請求介面的示例,可以刪除
base.php 基礎檔案,包含配置檔案、公共函式庫、建立$app例項。
所有介面首先引入base.php,此檔案中會建立例項$app,
連線資料庫和redis都通過此例項。
config.php 有些因執行環境(開發、測試、生產)不一樣的配置資訊寫在
這個檔案中,這個檔案在釋出時不需要釋出。
base.php 程式碼如下:
<?php
/*
* 基礎檔案,包含配置檔案、公共函式庫、建立$app例項
* 所有介面首先引入base.php,此檔案中會建立例項$app,連線資料庫和redis都通過此例項
*/
//配置檔案往$config陣列中寫
$config = [];
//有些因執行環境(開發、測試、生產)不一樣的配置資訊寫在config.php中,不跟隨專案釋出
$config = array_merge($config, require('config.php'));
function connectDB($options)
{
try {
$pdo = new PDO(
$options['dsn'],
$options['username'],
$options['password'],
$options['option']
);
// 設定 PDO 錯誤模式為異常 ,用於丟擲異常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
if (isset($options['charset'])) {
$pdo->exec('SET NAMES "'.$options['charset'].'"');
}
return $pdo;
}
catch (PDOException $e) {
throw new Exception($e->getMessage());
}
}
function connectRedis($options)
{
$redis = new Redis();
$redis->pconnect($options['host'], $options['port']);
return $redis;
}
class wjw
{
public $db_list = [];
public $redis_list = [];
public $helpers = [];
public function __construct()
{
}
public function __destruct()
{
foreach ($this->db_list as $key => &$pdo) {
$pdo = null;
unset($this->db_list[$key]);
}
foreach ($this->redis_list as $key => &$redis) {
$redis->close();
unset($this->redis_list[$key]);
}
}
public function db($db_name='default')
{
global $config;
$db_name = empty($db_name)?'default':$db_name;
if (!isset($config['db'][$db_name]) ) {
throw new Exception('資料庫配置不存在:'.$db_name);
}
if ( !isset($this->db_list[$db_name]) && isset($config['db'][$db_name]) ) {
$this->db_list[$db_name] = connectDB($config['db'][$db_name]);
}
return $this->db_list[$db_name];
}
public function redis($redis_name='default')
{
global $config;
$redis_name = empty($redis_name)?'default':$redis_name;
if (!isset($config['redis'][$redis_name]) ) {
throw new Exception('Redis配置不存在:'.$redis_name);
}
if ( !isset($this->redis_list[$redis_name]) && isset($config['redis'][$redis_name]) ) {
$this->redis_list[$redis_name] = connectRedis($config['redis'][$redis_name]);
}
return $this->redis_list[$redis_name];
}
public function __get($name)
{
if (isset($this->helpers[$name])) {
return $this->helpers[$name];
}
if (file_exists(dirname(__FILE__).'/helper/'.$name.'.php')) {
//helper類檔案的檔名、類名、app中的呼叫方法三者需要一致
require_once(dirname(__FILE__).'/helper/'.$name.'.php');
$this->helpers[$name] = new $name;
return $this->helpers[$name];
}
else{
throw new Exception('helper檔案不存在:'.$name.'.php');
}
}
}
$app = new wjw();
config.php程式碼如下:
<?php
return [
'db' => [
'default' => [
'dsn' => 'mysql:host=127.0.0.1;port=3306;dbname=yourDbName',
'username' => 'yourUsername',
'password' => 'yourPassword',
'charset' => 'utf8',
'option' => [],
]
],
'redis' => [
'default' => [
'host' => '127.0.0.1',
'port' => '6379',
]
],
];
/public/demo.php 程式碼如下:
<?php
/*
* 介面示例,每個介面一個檔案,或者每類介面一個檔案,原則上是單個檔案越小越好
* 所有介面首先引入base.php,此檔案中會建立例項$app,連線資料庫和redis都通過此例項
*/
require_once('../base.php');
//使用PHP中PDO的原生方法運算元據庫
讀取一條記錄
$uuid = 763;
$sql = 'SELECT * FROM `users` WHERE `uid` = :uid LIMIT 1';
$stmt = $app->db()->prepare($sql);
$stmt->execute(array(':uid'=>$uid));
while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
print_r($row);
}
//讀取資料列表
$status = 6;
$sql = 'SELECT * FROM `users` WHERE `status` < :status LIMIT 3';
$stmt = $app->db()->prepare($sql);
$stmt->execute(array(':status'=>$status));
print_r( $stmt->fetchAll(PDO::FETCH_ASSOC));
unset($stmt);
//使用PHP中redis的原生方法操作redis
$app->redis()->set('aaa', 'aaa的值');
$value = $app->redis()->get('aaa');
print_r($value);
//將helper類檔案放入helper目錄中,使用$app->yourClassName 呼叫
//helper類檔案的檔名、類名、app中的呼叫方法三者需要一致
$app->helper_demo->test_helper('測試helper的使用');
/helper/helper_demo.php 程式碼如下:
<?php
class helper_demo
{
public function __construct()
{
}
public function __destruct()
{
}
public function test_helper($val)
{
var_dump($val);
}
}
後期可能會增加少量常用函式和類,增加後修改原文內容,也可以在我的個人網站中檢視。
http://www.weinidai.com/index.php/News/detail/id/127
歡迎 phper 們留言評論,指出不足和提出寶貴建議。
相關文章
- 極簡,高效能分散式 PHP 框架分散式PHP框架
- 模仿KOA,用php來寫一個極簡的開發框架PHP框架
- 極其簡單的Flutter 螢幕適配Flutter
- 精簡版的Rails框架->Rails::APIAI框架API
- 極速精簡 Go 版 LogstashGo
- 最精簡的自定義.net 開發框架框架
- 打造手淘極簡包的輕量化框架框架
- 函式極限與連續精簡版函式
- 【xiaosonl】一個極其簡單的線上C#IDE例子C#IDE
- 關於 PHP 框架的簡單思考PHP框架
- 學習abp vnext框架到精簡到我的Vop框架框架
- 一個只有十行的精簡MVVM框架MVVM框架
- 一個很簡單的PHP框架lyuePHP框架
- lenneth — 基於koa2 的web極簡框架Web框架
- 2017 年 20 個最佳的極簡 CSS 框架CSS框架
- lenneth -- 基於koa2 的web極簡框架Web框架
- 自研 PHP 框架 1.0_簡介PHP框架
- 自研 PHP 框架 1.1_簡介PHP框架
- 簡陋到極致便成了經典,看似很Low的開羅遊戲其實並不簡單遊戲
- 極簡.高效能.分散式框架,可執行於多種環境(apache/php-fpm,swoole)分散式框架ApachePHP
- 極致簡潔的微前端框架-京東MicroApp開源了前端框架APP
- 極簡的Restful框架推薦->Resty(服務端+客戶端)REST框架服務端客戶端
- 將 LLMs 精調至 1.58 位元: 使極端量化變簡單
- PHP單一檔案入口框架簡析PHP框架
- PHP單一入口框架設計簡析PHP框架
- phpspider簡單快速上手的php爬蟲框架PHPIDE爬蟲框架
- Just for fun——PHP框架之簡單的路由器(2)PHP框架路由器
- 極簡實用的Asp.NetCore框架再新增商城模組ASP.NETNetCore框架
- 迅雷精簡版 for Mac!附精簡教程!Mac
- 《硬碟清道夫》的序號產生器 一個極其簡單的軟體! (649字)硬碟
- 極簡實用的Asp.NetCore模組化框架新增CMS模組ASP.NETNetCore框架
- 一個使用 Composer 構建的極簡 Laravel 核心功能框架 larasimpleLaravel框架
- HappyIcon v2.55----------極其簡單,高手勿入 (7千字)APP
- [精選]Clean PHP Code(清晰的PHP程式碼思路)PHP
- 終於受不了 Yaf,寫了個精簡框架 Zim,作為 PHP 擴充套件執行,歡迎扔雞蛋!框架PHP套件
- 極其出色程式設計師的各種跡象程式設計師
- vnc最精簡的配置VNC
- 一個極簡的RePluginPlugin