
# Хости з обмеженнями на процеси

На віртуальному хостингу, у захищених контейнерах і на деяких платформах 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` використовуються лише допоміжними засобами порівняння: генератором матриці можливостей, засобом запуску бенчмарків і засобом тестування за еталоном. `Greph::search*()`, `Greph::rewriteAst()`, засоби створення індексу та чотири виконувані файли їх не викликають.

Перед створенням дочірніх процесів пул перевіряє `function_exists('pcntl_fork')`. Для PHP функція зі списку `disable_functions` вважається неіснуючою, тому на такому хості кожен блок виконується в поточному процесі з тим самим результатом, що й у `-j 1`. Дивіться розділ [Паралельні робочі процеси](https://greph.inline0.dev/uk/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`. Генератор завершить роботу без запуску процесу, але не зможе створити корисний звіт: проби для upstream-інструментів матимуть статус `Unavailable`, а для власних виконуваних файлів Greph — статус `Fail`, бо кожна проба запускає команду. Згенеруйте [матрицю можливостей](https://greph.inline0.dev/uk/docs/advanced/feature-matrix) на комп'ютері, де дозволено запускати процеси.
