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 확장자를 사용하려면 phpstan.neon 의 ./vendor/schlndh/maria-stan/extension.mysqli.neon 을 포함하십시오.
MySQLI Extension을 시작점으로 사용할 수 있습니다. 기본 아이디어는 phpstan에서 쿼리 문자열을 가져 와서 분석을 위해 Mariastan에게 전달한 다음 결과 유형과 오류를 PhpStan에 다시보고하는 것입니다.
Mariastan을 프로젝트에 통합하기 위해 자신의 확장을 구현하기 전에 빠르게 사용해 볼 수 있습니다. MySQLI 확장자를 사용하는 간단한 예제를 확인하여 시작할 수 있습니다. 그런 다음 MySQLI를 통해 코드베이스에서 쿼리를 호출하여 MySQLI 확장으로 분석하여 Mariastan이 프로젝트가 사용하는 기능을 지원할 수 있습니다.
다음은 Mariastan을 기반으로 자신의 Phpstan Extension으로 구현할 수있는 기능 목록입니다 (대부분 MySQLI Extension에서 시연되어야합니다).
mysqli_result::fetch_fields ). Mariastan은 (간단한 경우) SELECT col FROM tbl WHERE col IS NOT NULL 같은 쿼리를 이해하고 결과 유형에서 NULL 제거하는 반면 MariaDB는 그렇게하지 않는 것 같습니다.INSERT / REPLACE 의 필수 열에 대한 누락 데이터mysqli_result::fetch_all 과 같은 반환 메소드 유형을 좁히는 데 사용될 수있는 반환 된 행 (예 non-empty-array SELECT COUNT(*) FROM tbl 의 수를 결정할 수 있습니다. function foo ( mysqli $ db , int $ count ) {
return $ db -> prepare ( " SELECT * FROM tbl WHERE id IN ( " . implode ( ' , ' , array_fill ( 0 , $ count , ' ? ' )) . ' ) ' );
}내가 알 수있는 한, Phpstan-DBA는 쿼리를 실행하여 결과 유형, 오류에 대한 정보를 얻기 위해 작동합니다. phpstan-dba의 이점은 다음과 같습니다.
Phpstan-DBA의 접근 방식에는 약간의 단점이 있습니다.
information_schema 에서 데이터를 얻기 위해). 그러나 CREATE TABLE 등을 구현하고 구문 분석하고 그 위에 DB 반사를 구현할 수 있습니다.SELECT 하도록 제한하는 몇 가지 조건과 트랜잭션 사용을 보았습니다. 따라서 INSERT 등을 얼마나 잘 지원하는지 잘 모르겠습니다 (적어도 테스트에 일부가 있습니다).