soar-PHP - SQL 語句優(yōu)化器和重寫器的 PHP 擴(kuò)展包、SQL 語句調(diào)優(yōu)開發(fā)利器

soar-php 是一個(gè)基于小米公司開源的 soar 開發(fā)的 PHP 擴(kuò)展包,方便框架中 SQL 語句調(diào)優(yōu)。

項(xiàng)目鏈接

框架中使用

  • [x] ThinkPHP
  • [ ] Symfony
  • [ ] Laravel
  • [ ] Lumen
  • [ ] Yii2
  • [ ] Slim

環(huán)境要求

  • PHP >= 5.6
  • ext-pdo
  • ext-json

安裝

$ composer require guanguans/soar-php --dev

使用

下載 XiaoMi 開源的 SQL 優(yōu)化器 soar蓖议,更多詳細(xì)安裝請(qǐng)參考 soar install

# macOS
$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.darwin-amd64
# linux
$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64
# windows
$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.windows-amd64
# 用其他命令或下載器下載均可以

初始化配置虏杰,更多詳細(xì)配置請(qǐng)參考 soar config

方法一、運(yùn)行時(shí)初始化配置

<?php

require_once __DIR__.'/vendor/autoload.php';

use Guanguans\SoarPHP\Soar;

$config = [
    // 下載的 soar 的路徑
    '-soar-path' => '/Users/yaozm/Documents/wwwroot/soar-php/soar.darwin-amd64',
    // 測(cè)試環(huán)境配置
    '-test-dsn' => [
        'host' => '127.0.0.1',
        'port' => '3306',
        'dbname' => 'database',
        'username' => 'root',
        'password' => '123456',
    ],
    // 日志輸出文件
    '-log-output' => './soar.log',
    // 報(bào)告輸出格式: 默認(rèn)  markdown [markdown, html, json]
    '-report-type' => 'html',
];
$soar = new Soar($config);

方法二勒虾、配置文件初始化配置

vendor 同級(jí)目錄下新建 .soar.dist 或者 .soar纺阔,內(nèi)容參考 .soar.example,例如:

<?php
return [
    // 下載的 soar 的路徑
    '-soar-path' => '/Users/yaozm/Documents/wwwroot/soar-php/soar.darwin-amd64',
    // 測(cè)試環(huán)境配置
    '-test-dsn' => [
        'host' => '127.0.0.1',
        'port' => '3306',
        'dbname' => 'database',
        'username' => 'root',
        'password' => '123456',
    ],
    // 日志輸出文件
    '-log-output' => './soar.log',
    // 報(bào)告輸出格式: 默認(rèn)  markdown [markdown, html, json]
    '-report-type' => 'html',
];

然后初始化

<?php

require_once __DIR__.'/vendor/autoload.php';

use Guanguans\SoarPHP\Soar;

$soar = new Soar();

配置優(yōu)先級(jí):運(yùn)行時(shí)初始化配置 > .soar > .soar.dist

SQL 評(píng)分

方法調(diào)用:

$sql ="SELECT * FROM `fa_user` `user` LEFT JOIN `fa_user_group` `group` ON `user`.`group_id`=`group`.`id`;";
echo $soar->score($sql);

輸出結(jié)果:

score.png

explain 信息解讀

方法調(diào)用:

$sql = "SELECT * FROM `fa_auth_group_access` `aga` LEFT JOIN `fa_auth_group` `ag` ON `aga`.`group_id`=`ag`.`id`;";
// 輸出 html 格式
echo $soar->htmlExplain($sql);
// 輸出 md 格式
echo $soar->mdExplain($sql);
// 輸出 html 格式
echo $soar->explain($sql, 'html');
// 輸出 md 格式
echo $soar->explain($sql, 'md');

輸出結(jié)果:

explain.png

語法檢查

方法調(diào)用:

$sql = 'selec * from fa_user';
echo $soar->syntaxCheck($sql);

輸出結(jié)果:

At SQL 1 : line 1 column 5 near "selec * from fa_user" (total length 20)

SQL 指紋

方法調(diào)用:

$sql = 'select * from fa_user where id=1';
echo $soar->fingerPrint($sql);

輸出結(jié)果:

select * from fa_user where id = ?

SQL 美化

方法調(diào)用:

$sql = 'select * from fa_user where id=1';
var_dump($soar->pretty($sql));

輸出結(jié)果:

SELECT  
  * 
FROM  
  fa_user  
WHERE  
  id  = 1;

markdown 轉(zhuǎn)化為 html

方法調(diào)用:

echo $soar->md2html("## 這是一個(gè)測(cè)試");

輸出結(jié)果:

...
<h2>這是一個(gè)測(cè)試</h2>
...

soar 幫助

方法調(diào)用:

var_dump($soar->help());

輸出結(jié)果:

···
'Usage of /Users/yaozm/Documents/wwwroot/soar-php/soar:
  -allow-charsets string
        AllowCharsets (default "utf8,utf8mb4")
  -allow-collates string
        AllowCollates
  -allow-drop-index
        AllowDropIndex, 允許輸出刪除重復(fù)索引的建議
  -allow-engines string
        AllowEngines (default "innodb")
  -allow-online-as-test
        AllowOnlineAsTest, 允許線上環(huán)境也可以當(dāng)作測(cè)試環(huán)境
  -blacklist string
        指定 blacklist 配置文件的位置从撼,文件中的 SQL 不會(huì)被評(píng)審州弟。
···    

執(zhí)行任意 soar 命令

方法調(diào)用:

$command = "echo '## 這是另一個(gè)測(cè)試' | /Users/yaozm/Documents/wwwroot/soar-php/soar.darwin-amd64 -report-type md2html";
echo $soar->exec($command);

輸出結(jié)果:

...
<h2>這是另一個(gè)測(cè)試</h2>
...

參考鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末低零,一起剝皮案震驚了整個(gè)濱河市婆翔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掏婶,老刑警劉巖啃奴,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異雄妥,居然都是意外死亡最蕾,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門老厌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘟则,“玉大人,你說我怎么就攤上這事枝秤〈着。” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵淀弹,是天一觀的道長丹壕。 經(jīng)常有香客問我,道長薇溃,這世上最難降的妖魔是什么菌赖? 我笑而不...
    開封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮沐序,結(jié)果婚禮上琉用,老公的妹妹穿的比我還像新娘。我一直安慰自己策幼,他們只是感情好邑时,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著垄惧,像睡著了一般刁愿。 火紅的嫁衣襯著肌膚如雪绰寞。 梳的紋絲不亂的頭發(fā)上到逊,一...
    開封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天铣口,我揣著相機(jī)與錄音,去河邊找鬼觉壶。 笑死脑题,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的铜靶。 我是一名探鬼主播叔遂,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼争剿!你這毒婦竟也來了已艰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蚕苇,失蹤者是張志新(化名)和其女友劉穎哩掺,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩笤,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚼吞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蹬碧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片舱禽。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖恩沽,靈堂內(nèi)的尸體忽然破棺而出誊稚,到底是詐尸還是另有隱情,我是刑警寧澤飒筑,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布片吊,位于F島的核電站,受9級(jí)特大地震影響协屡,放射性物質(zhì)發(fā)生泄漏俏脊。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一肤晓、第九天 我趴在偏房一處隱蔽的房頂上張望爷贫。 院中可真熱鬧,春花似錦补憾、人聲如沸漫萄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽腾务。三九已至,卻和暖如春削饵,著一層夾襖步出監(jiān)牢的瞬間岩瘦,已是汗流浹背未巫。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留启昧,地道東北人叙凡。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像密末,于是被迫代替她去往敵國和親握爷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容