
# Ievads
Greph ir tīrs PHP meklēšanas un pārstrukturēšanas dzinis avota koda kokiem. Tas piedāvā trīs saistītus režīmus:

- **Teksta meklēšana** ar grep saderīgu izvadi un ripgrep raksturīgo ērto lietošanu.
- **AST meklēšana** ar PHP strukturālajiem paraugiem un metamainīgajiem.
- **AST pārrakstīšana** ar formatējumu saglabājošu strukturālo pārveidošanu.

Komplektā ir arī uzsildīti indeksētie režīmi teksta un AST slodzēm, dzīves ciklam pielāgotas atsvaidzināšanas politikas, uz manifestiem balstītas uzsildīto indeksu kopas un ar `rg` / `sg` saderīgi wrapperi rīku un aģentu vidēm.

## Kāpēc tika izveidots Greph

Lietotnes un aģenti, kam nepieciešama ātra koda meklēšana, parasti izsauc vietējos rīkus (`grep`, `ripgrep`, `ast-grep`), atsakoties no pārnesamības un apgrūtinot izvietošanu. Strukturālā meklēšana un pārrakstīšana ir vēl sarežģītāka: parasti tas nozīmē pilnībā pamest PHP procesu.PHP

Greph novērš šo trūkumu. Jūsu PHP kodā var veikt teksta meklēšanu, strukturālu atbilstību meklēšanu un pārstrukturēšanu, izmantojot tikai standarta bibliotēku un `nikic/php-parser`. Izvade un izejas kodi ir saderīgi ar kanoniskajiem rīkiem, tāpēc esošie skripti un aģenti nav jāmaina.

## Ko tas dara

- Teksta meklēšana pēc fiksētām virknēm un regulārajām izteiksmēm ar pilna vārda, reģistrnejutīgas atbilstības, konteksta, skaita un tikai failu režīmiem
- Strukturāla PHP AST meklēšana ar `$VAR`, `$$$VARIADIC` un atkārtotiem metamainīgajiem
- Formatējumu saglabājoša AST pārrakstīšana ar izmēģinājuma, interaktīvo un rakstīšanas režīmu
- Uzsildīti teksta indeksi (trigrammas un identifikatoru ieraksti) atkārtotām slodzēm
- Uzsildīts AST faktu indekss un kešota AST meklēšana atkārtotiem strukturāliem vaicājumiem
- Dzīves ciklam pielāgoti uzsildītie indeksi: `static`, `manual-refresh`, `opportunistic-refresh`, `strict-stale-check`
- Vairāku indeksu un nosaukto kopu meklēšana uzsildītos teksta, AST faktu un AST kešatmiņas krātuvēs
- Plānotāja diagnostika ar `--trace-plan` un indeksu izcelsmes marķējumu uzsildītajai meklēšanai
- Ar to pašu dzini darbināti ripgrep un ast-grep CLI saderības wrapperi
- Uz pcntl balstīts paralēlo darbplūsmu kopums ar viena procesa rezerves režīmu
- Failu pārlūks, kas ievēro gitignore un `.grephignore`, un atpazīst bināros failus

## Kas tam nepieciešams

- PHP 8.2 vai jaunāka versija
- `ext-json`, `ext-ctype` un `ext-tokenizer`, kas ir iespējoti gandrīz katrā PHP būvējumā
- `ext-zlib` kešotajai AST krātuvei (`greph-index ast-cache`)
- `nikic/php-parser` (vienīgā Composer atkarība)

Teksta un AST pamatfunkcijas darbojas tīrā PHP vidē. Pēc izvēles pieejamā salīdzināšana etalonpārbaudēs ir atkarīga no ārējiem rīkiem, piemēram, `rg`, `grep` un `sg`, taču paša Greph darbībai tie nav vajadzīgi. Paralēlās skenēšanas izmanto `ext-pcntl`, ja tas ir pieejams, un citādi bez problēmām pārslēdzas uz viena procesa izpildi. Sadaļā [Procesiem ierobežotas vides](https://greph.inline0.dev/lv/docs/advanced/process-restricted-hosts) aplūkoti resursdatori, kas aizliedz `proc_open()` un `shell_exec()`.

## Īss piemērs

`vendor/bin` izpildāmajām programmām nepieciešama Greph 0.2.3 vai jaunāka versija, ja Greph ir instalēts kā jūsu projekta atkarība.

```bash
# 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 src
```

```php
use 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(),
);

$rewrites = Greph::rewriteAst(
    'array($$$ITEMS)',
    '[$$$ITEMS]',
    'src',
);
```

Sāciet ar sadaļu [Darba sākšana](https://greph.inline0.dev/lv/docs/getting-started), pēc tam pārējo funkcionalitāti skatiet sadaļās [CLI](https://greph.inline0.dev/lv/docs/cli) un [API](https://greph.inline0.dev/lv/docs/api). Sadaļās [Režīmi](https://greph.inline0.dev/lv/docs/modes/text), [Indeksēšana](https://greph.inline0.dev/lv/docs/indexed/text) un [Saderība](https://greph.inline0.dev/lv/docs/compatibility/rg) detalizēti aplūkotas konkrētas darbplūsmas.
