Greph
순수 PHP 코드 검색, 구조 검색 및 재작성 엔진입니다. grep, ripgrep 및 ast-grep 워크플로우를 하나의 Composer 패키지로 제공합니다.
composer require greph/greph최신 릴리스 v0.2.3 MIT PHP 8.2+
# Any method call with any arguments
vendor/bin/greph -p '$obj->$method($$$ARGS)' src
# Any function declaration with a void return type
vendor/bin/greph -p 'function $name($$$PARAMS): void {}' src
# Old-style array calls
vendor/bin/greph -p 'array($$$ITEMS)' src실제 사용
Composer로 패키지를 설치한 다음 명령줄이나 PHP에서 검색하고 재작성하세요.
검색, 매치 및 재작성 미리 보기
-F은 고정 문자열 텍스트 검색을 실행하고, -p는 PHP 형태의 패턴과 $CLASS 같은 메타변수를 사용하며, -r는 대체 템플릿을 추가합니다. --dry-run를 사용하면 파일을 쓰지 않고 재작성된 내용을 출력합니다.
정적 Greph 퍼사드는 PHP 코드에 동일한 작업을 제공합니다. 의존성으로 설치한 경우 vendor/bin 명령을 사용하려면 버전 0.2.3 이상이 필요합니다.
# Text search
vendor/bin/greph -F "function" src
# Structural search
vendor/bin/greph -p 'new $CLASS()' src
# Structural rewrite preview
vendor/bin/greph -p 'array($$$ITEMS)' -r '[$$$ITEMS]' --dry-run srcuse Greph\Greph;
use Greph\Ast\AstSearchOptions;
use Greph\Text\TextSearchOptions;
$matches = Greph::searchText(
'function',
'src',
new TextSearchOptions(fixedString: true),
);
$asts = Greph::searchAst(
'new $CLASS()',
'src',
new AstSearchOptions(),
);순수 PHP
검색과 재작성은 grep, ripgrep 또는 ast-grep 바이너리 없이 PHP 8.2+에서 실행됩니다. json, ctype 및 tokenizer 확장과 캐시된 AST 저장소용 zlib를 사용합니다.
텍스트 검색
고정 문자열 및 정규식 검색에 단어 전체 일치, 대소문자 구분 없는 검색, 컨텍스트, 개수 및 파일 전용 모드를 지원합니다. grep 호환 출력을 제공합니다.
AST 검색
PHP 소스의 구조 검색을 지원하며 $VAR 및 $$$VARIADIC 메타변수, 반복 캡처와 JSON 출력을 제공합니다. 지원되는 언어는 PHP뿐입니다.
AST 재작성
시험 실행, 대화형 및 쓰기 모드를 지원하는 구조적 재작성 기능입니다. 매칭된 코드만 변경되며 매치 범위 밖의 주석과 레이아웃은 그대로 유지됩니다.
인덱스 모드
트라이그램 텍스트 인덱스, AST 사실 인덱스 또는 캐시된 AST 저장소를 한 번 빌드해 재사용하세요. 프로젝트 벤치마크에서 AST 사실 인덱스는 빌드에 1.4 s가 걸렸고 new $CLASS()를 2.9 s에서 11 ms로 줄였습니다. 트라이그램 인덱스 빌드에는 12.3 s가 걸렸습니다.
rg 및 sg 래퍼
vendor/bin/rg와 vendor/bin/sg은 동일한 엔진에서 일반적인 ripgrep 및 ast-grep 검색 플래그를 지원합니다. 지원하지 않는 항목: rg의 멀티라인, --replace, --type-add 및 --sort, sg의 YAML 규칙 및 비-PHP 언어.
PHP API
Greph::searchText(), searchAst() 및 rewriteAst()는 타입이 지정된 결과 객체를 반환하므로 PHP 코드와 에이전트가 하위 프로세스 없이 엔진을 호출할 수 있습니다.
오라클 코퍼스
39개 시나리오에서 greph의 텍스트, AST 및 재작성 출력을 grep, ripgrep 및 ast-grep과 비교합니다. 저장소를 복제한 뒤 composer test:oracle로 실행하세요. CI에서는 단위 및 통합 테스트 모음을 실행합니다.
Greph를 사용하는 이유
네이티브 바이너리 없음
검색과 재작성은 PHP 프로세스 내부에서 실행됩니다. rg, grep 및 sg 바이너리는 선택적 벤치마크 비교에만 사용됩니다.
모든 모드를 위한 하나의 엔진
텍스트 검색, PHP 구조 검색 및 재작성이 하나의 Composer 패키지에 포함됩니다. rg 및 sg 래퍼는 vendor/bin/greph와 동일한 엔진을 호출합니다.
매치된 부분만 재작성
재작성기는 렌더링된 템플릿을 매치된 바이트 범위에 삽입합니다. 매치 밖의 코드는 들여쓰기, 주석 및 빈 줄을 유지합니다.
데몬 없이 인덱스 재사용
인덱스는 디스크에 저장되어 실행 간 재사용됩니다. 수명 주기 프로필에 따라 오래된 인덱스를 그대로 두거나, 검색 중 새로 고치거나, 사용을 거부합니다.
비교 대상
Greph는 검색과 재작성을 PHP 안에서 처리합니다. 이 도구들은 관련 문제를 해결하며 Greph가 하지 않는 작업도 일부 수행합니다.
| 도구 | 잘하는 점 | Greph와의 차이점 |
|---|---|---|
| ripgrep | 잘하는 점재귀 정규식 검색 도구로, Windows, macOS 및 Linux에서 처음부터 지원되며 모든 릴리스의 바이너리를 다운로드할 수 있습니다. 기본적으로 gitignore 규칙을 따르고 숨김 파일과 바이너리 파일을 건너뜁니다. | Greph와의 차이점Greph는 Composer로 설치하고 PHP에서 실행합니다. WordPress 코퍼스에 대한 CI 벤치마크에서 rg는 모든 콜드 텍스트 쿼리에서 더 빨랐습니다. 예를 들어 리터럴 검색은 458.82 ms와 비교해 81.62 ms였습니다. 워밍업된 Greph 인덱스는 개수 쿼리에 49.61 ms가 걸린 rg보다 빠른 10.90 ms에 답했습니다. |
| ast-grep | 잘하는 점tree-sitter를 기반으로 구조 검색, 린트 및 재작성을 수행하는 컴파일된 CLI입니다. PHP를 포함한 여러 언어를 기본 지원하며 린트 규칙과 코드 변경을 위한 YAML 규칙 파일도 제공합니다. | Greph와의 차이점Greph는 PHP만 처리하며 YAML 규칙은 읽지 않습니다. 프로젝트 CI 벤치마크의 콜드 검색에서 Greph의 array($$$ITEMS)에는 sg가 더 빨랐습니다. Greph의 워밍업된 AST 인덱스는 new $CLASS()에 10.89 ms 만에 답했으며 sg는 4093.61 ms가 걸렸습니다. |
| Rector | 잘하는 점규칙과 규칙 세트를 통해 PHP 코드를 업그레이드하고 리팩터링합니다. 5.3부터 8.5까지의 PHP 버전과 Symfony, PHPUnit 및 Doctrine 같은 프로젝트를 지원합니다. | Greph와의 차이점Greph는 직접 작성한 패턴과 템플릿을 바탕으로 재작성합니다. 설명서에 따르면 단일 파일에서 PHP-Parser가 확인할 수 없는 형식 정보에 변경이 의존하거나 파일 간 가져오기를 추가 또는 제거해야 하는 경우에는 적합하지 않습니다. |
| PHP CS Fixer | 잘하는 점코딩 표준을 따르도록 코드를 수정하며 PHP-FIG의 PER 코딩 스타일 같은 규칙 세트를 기본 제공합니다. | Greph와의 차이점Greph는 파일을 다시 포맷하지 않습니다. 패턴과 매치된 코드만 변경하며 포매터가 필요할 때는 PHP CS Fixer를 사용하도록 설명서에서 안내합니다. |
질문과 답변
Greph 문서의 간단한 답변.
아니요. Greph는 PHP에서 검색과 재작성을 실행합니다. 외부 rg, grep 및 sg 바이너리는 선택적 벤치마크 비교에만 사용됩니다.
PHP만 지원합니다. 패턴과 소스 파일은 nikic/php-parser로 파싱하며, 다른 --lang 값은 지원되지 않는 값으로 거부됩니다.
콜드 스캔에서는 그렇지 않습니다. WordPress 코퍼스를 대상으로 한 프로젝트 CI 벤치마크에서는 모든 콜드 텍스트 쿼리에서 rg와 grep이 더 빨랐습니다. 인덱스가 준비된 상태에서는 반복 쿼리에 도움이 됩니다. 예를 들어 인덱싱된 개수 조회에서 rg의 49.61 ms에 비해 10.90 ms가 걸립니다.
Greph는 단일 프로세스로 실행됩니다. pcntl_fork가 없으면 워커 풀이 모든 청크를 프로세스 내부에서 처리합니다. 결과는 -j 1과 같으며 오류는 발생하지 않습니다.
매치 범위 밖은 그렇지 않습니다. 매치된 바이트 범위 밖의 코드는 공백, 주석 및 레이아웃을 유지합니다. 매치된 코드는 템플릿에서 다시 출력되므로 줄바꿈이 정규화되고 그 안의 주석은 사라질 수 있습니다. 먼저 --dry-run으로 실행하면 파일을 쓰지 않고 재작성된 내용을 출력합니다.
기본적으로 인덱싱된 루트의 .greph-index, .greph-ast-index 및 .greph-ast-cache에 저장됩니다. 다른 위치를 사용하려면 greph-index 하위 명령에 --index-dir를 전달하세요.
Greph 설명서에서 CLI 참조, PHP API, 인덱스 모드 및 rg와 sg 래퍼를 확인하세요.