
# Хосты с ограничением процессов

На виртуальном хостинге, в защищенных контейнерах и на некоторых платформах PaaS функции запуска процессов отключены через `disable_functions`. Операции поиска, переписывания и индексирования Greph выполняются внутри процесса PHP (параллельное сканирование при возможности порождает его рабочие копии), поэтому продолжают работать и там.

## Запуск процессов

| Код | Функция | Назначение |
|---|---|---|
| `Greph\Support\ToolResolver` | `shell_exec()` | Поиск внешних бинарных файлов `grep`, `rg`, `sg` (или `npm`) и `gh` в `PATH` |
| `Greph\Support\CommandRunner` | `proc_open()` | Запуск этих бинарных файлов и исполняемых файлов Greph как подпроцессов |
| `Greph\Parallel\WorkerPool` | `pcntl_fork()` | Параллельные рабочие процессы для `-j N` / `jobs: N` |

`ToolResolver` и `CommandRunner` используются только средствами сравнения: генератором матрицы функций, набором бенчмарков и тестовым стендом oracle. `Greph::search*()`, `Greph::rewriteAst()`, сборщики индексов и четыре исполняемых файла никогда их не вызывают.

Пул рабочих процессов проверяет `function_exists('pcntl_fork')` перед созданием дочерних процессов. Если функция указана в `disable_functions`, для PHP ее не существует, поэтому на таком хосте каждый фрагмент обрабатывается в том же процессе с тем же результатом, что и `-j 1`. См. [Параллельные рабочие процессы](https://greph.inline0.dev/ru/docs/advanced/parallel).

Даже если отключены `proc_open`, `shell_exec`, `exec`, `system`, `passthru`, `popen` и `pcntl_fork`, текстовый поиск с `jobs: 4`, переписывание AST, `greph-index build`, `greph-index ast-cache build` и `search`, а также оболочки `rg` и `sg` работают штатно.

## Вспомогательные средства без процессов

При встраивании вспомогательных средств сравнения в такой хост создавайте их с явно заданной политикой запрета процессов:

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

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

Эти экземпляры работают по принципу отказа по умолчанию: при любом поиске или выполнении команды выбрасывается `RuntimeException`, и процесс не запускается.

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

Передавайте их туда, где принимаются `ToolResolver` или `CommandRunner`, например в аргументы `toolResolver:` и `commandRunner:` функции `Greph\FeatureMatrix\FeatureMatrixGenerator`. Генератор завершится без запуска процессов, но не сможет сформировать полезный отчет: проверки сторонних инструментов будут отмечены как `Unavailable`, а проверки собственных исполняемых файлов Greph — как `Fail`, поскольку каждая проверка представляет собой команду. Создавайте [матрицу функций](https://greph.inline0.dev/ru/docs/advanced/feature-matrix) на машине, где разрешены процессы.
