Mariastan是Mariadb查詢的靜態分析工具。它的主要目的是作為Phpstan擴展的基礎。
當前狀態(24。04。2024):
Mariastan非常不完整。它可能覆蓋我使用的大型代碼庫中約90%的用例(數百個表,數千個查詢)。結果,沒有太多活動。但這是從某種意義上積極維護的,如果某件事對我來說可能會得到解決。
如果您嘗試在項目中使用它,則可能會遇到未實現的用例(例如,我的項目不使用的語法/函數)。如果發生這種情況,您應該準備自己修理問題(大多數事情應該很容易)。
任何事情都沒有向後兼容的承諾,也沒有發布 - 我只是使用主人。
Mariastan通過Mariadb 10.11和Php 8.1-8.3進行了測試。
使用composer require --dev schlndh/maria-stan:dev-master 。然後,您需要將以下內容添加到您的phpstan.neon :
includes :
- ./vendor/schlndh/maria-stan/extension.neon
Mariastan需要訪問數據庫模式。提供它的最簡單方法是讓其直接連接到數據庫。您需要將以下配置添加到phpstan.neon並設置適當的憑據:
parameters :
maria-stan :
db :
# Change these to match your database
host : 127.0.0.1
port : 3306
user : ' root '
password : ' '
database : ' db 'Mariastan需要訪問數據庫來獲取架構以進行查詢分析。它只讀取表格架,沒有寫任何東西。但是,不要讓它訪問任何包含任何重要數據的數據庫。
另外,也可以在分析過程中使用Mariastan而無需訪問數據庫。在這種情況下,您需要首先使用MariaDbFileDbReflection::dumpSchema將模式轉儲,然後將其保存到文件中。這是一個執行此操作的示例腳本:
<?php
declare (strict_types= 1 );
use MariaStan DbReflection MariaDbFileDbReflection ;
require_once __DIR__ . ' /vendor/autoload.php ' ;
$ mysqli = new mysqli ( ' 127.0.0.1 ' , ' root ' , '' );
file_put_contents ( __DIR__ . ' /maria-stan-schema.dump ' , MariaDbFileDbReflection:: dumpSchema ( $ mysqli , ' database ' ));然後將以下內容添加到您的phpstan.neon :
parameters :
maria-stan :
reflection :
file : %rootDir%/../../../maria-stan-schema.dump
services :
mariaDbReflection : @ mariaDbFileDbReflection請注意,相對路徑的自動擴展僅適用於PHPSTAN自己的配置(即這是配置鍵的硬編碼列表)。因此,您必須為轉儲文件提供絕對的路徑。
有關參數的完整列表,請參見extension.neon 。
Mariastan包括Mysqli的樣本Phpstan擴展名。但是,此擴展的目的僅僅是為了驗證與phpstan的集成。我不希望任何人實際使用mysqli。因此,期望您編寫與Mariastan集成的phpstan擴展名。如果您想使用mysqli擴展名,請包括./vendor/schlndh/maria-stan/extension.mysqli.neon在您的phpstan.neon中。
您可以將MySQLI擴展名作為起點A修改以符合您的需求。基本想法是從PHPSTAN獲取查詢字符串,將其傳遞給Mariastan進行分析,然後將結果類型和錯誤報告回PHPSTAN。
在開始實施自己的擴展程序以將Mariastan集成到您的項目中之前,您可以快速嘗試一下。您可以首先檢查一個使用MySQLI擴展名的簡單示例。然後,您可以嘗試通過Mysqli從代碼庫調查查詢,並使用MySQLI擴展名進行分析,以確保Mariastan支持您的項目使用的功能。
以下是您可以根據Mariastan在自己的phpstan擴展中實現的功能列表(其中大多數應在Mysqli擴展中進行演示):
mysqli_result::fetch_fields )推斷出更狹窄的類型。這是因為Mariastan可以(在簡單的情況下)理解查詢,例如SELECT col FROM tbl WHERE col IS NOT NULL並從結果類型中刪除NULL ,而Mariadb似乎沒有這樣做。INSERT / REPLACE中強制列的數據SELECT COUNT(*) FROM tbl ),該行可用於縮小mysqli_result::fetch_all (即non-empty-array )之類的方法的返回類型。 function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}據我所知,PHPSTAN-DBA通過執行查詢來獲取有關結果類型,錯誤,... Mariastan的信息通過靜態分析查詢。 phpstan-dba的好處包括:
Phpstan-DBA的方法有一些小小的缺點:
information_schema獲取數據,不一定在分析時間)。但是可以實現CREATE TABLE (等)解析並在此基礎上實現數據庫反射。SELECT查詢的條件以及交易的使用。因此,我不確定它如何支持INSERT等。 (至少有一些測試)。