
# Komandų vykdymą ribojančios aplinkos

Bendrojo prieglobos, sustiprinto saugumo konteineriuose ir kai kuriose PaaS platformose proceso funkcijos išjungiamos naudojant `disable_functions`. Greph paieškos, perrašymo ir indeksavimo operacijos vykdomos PHP procese (lygiagrečios peržiūros, kai įmanoma, išsišakoja ir sukuria darbines jo kopijas), todėl ten jos veikia.

## Kas paleidžia procesus

| Kodas | Funkcija | Paskirtis |
|---|---|---|
| `Greph\Support\ToolResolver` | `shell_exec()` | Išorinių `grep`, `rg`, `sg` (arba `npm`) ir `gh` dvejetainių failų paieška `PATH` sistemoje |
| `Greph\Support\CommandRunner` | `proc_open()` | Šių dvejetainių failų ir Greph vykdomųjų failų paleidimas kaip antrinių procesų |
| `Greph\Parallel\WorkerPool` | `pcntl_fork()` | Lygiagretūs `-j N` / `jobs: N` darbininkai |

`ToolResolver` ir `CommandRunner` naudojami tik palyginimo įrankiuose: funkcijų matricos generatoriuje, našumo testų aplinkoje ir etaloninių testų aplinkoje. `Greph::search*()`, `Greph::rewriteAst()`, indeksų kūrimo įrankiai ir keturi vykdomieji failai jų niekada nekviečia.

Darbininkų telkinys prieš išsišakodamas patikrina `function_exists('pcntl_fork')`. Funkcijų, nurodytų `disable_functions`, PHP požiūriu nėra, todėl tokiame serveryje kiekviena dalis vykdoma tame pačiame procese ir gaunamas toks pat rezultatas kaip naudojant `-j 1`. Žr. [Lygiagretūs darbininkai](https://greph.inline0.dev/lt/docs/advanced/parallel).

Kai išjungiamos `proc_open`, `shell_exec`, `exec`, `system`, `passthru`, `popen` ir `pcntl_fork`, teksto paieška su `jobs: 4`, AST perrašymas, `greph-index build`, `greph-index ast-cache build` ir `search`, taip pat `rg` ir `sg` apvalkalai veikia įprastai.

## Pagalbinės priemonės, veikiančios be procesų

Įterpdami palyginimo pagalbines priemones į tokį serverį, sukurkite jas taikydami aiškią procesų išjungimo politiką:

```php
use Greph\Support\CommandRunner;
use Greph\Support\ToolResolver;

$toolResolver = ToolResolver::processDisabled();
$commandRunner = CommandRunner::processDisabled();
```

Šie objektai saugiai atsisako veiksmų: kiekviena paieška ar komanda pateikia `RuntimeException`, užuot bandžiusi paleisti procesą.

```text
Process-based tool lookup is disabled; cannot resolve binary: rg
Process execution is disabled; cannot run command: rg --version
```

Perduokite jas visur, kur priimama `ToolResolver` arba `CommandRunner`, pavyzdžiui, `Greph\FeatureMatrix\FeatureMatrixGenerator` argumentuose `toolResolver:` ir `commandRunner:`. Tada generatorius baigia darbą nepaleidęs proceso, tačiau naudingos ataskaitos parengti negali: užklausų rezultatai prieš pradinius įrankius nurodomi kaip `Unavailable`, o užklausų, vykdančių Greph vykdomuosius failus, rezultatai – kaip `Fail`, nes kiekviena užklausa yra komanda. Generuokite [funkcijų matricą](https://greph.inline0.dev/lt/docs/advanced/feature-matrix) kompiuteryje, kuriame leidžiama paleisti procesus.
