
# Host con processi limitati

L’hosting condiviso, i container con protezioni rafforzate e alcune piattaforme PaaS disabilitano le funzioni di processo tramite `disable_functions`. Le operazioni di ricerca, riscrittura e indicizzazione di Greph vengono eseguite all’interno del processo PHP (le scansioni parallele ne creano copie per i worker, quando possibile), quindi continuano a funzionare anche in questi ambienti.

## Avvio dei processi

| Codice | Funzione | Utilizzo |
|---|---|---|
| `Greph\Support\ToolResolver` | `shell_exec()` | Individuazione dei binari esterni `grep`, `rg`, `sg` (o `npm`) e `gh` in `PATH` |
| `Greph\Support\CommandRunner` | `proc_open()` | Esecuzione di questi binari e degli eseguibili Greph come sottoprocessi |
| `Greph\Parallel\WorkerPool` | `pcntl_fork()` | Worker paralleli per `-j N` / `jobs: N` |

`ToolResolver` e `CommandRunner` servono solo agli strumenti di confronto: il generatore della matrice delle funzionalità, il sistema di benchmark e l’harness di test dell’oracolo. `Greph::search*()`, `Greph::rewriteAst()`, i generatori di indici e i quattro eseguibili non li chiamano mai.

Il pool di worker verifica `function_exists('pcntl_fork')` prima di creare i processi. Una funzione elencata in `disable_functions` per PHP non esiste; quindi, su un host di questo tipo, ogni blocco viene elaborato nel processo corrente, con lo stesso risultato di `-j 1`. Consultate [Worker paralleli](https://greph.inline0.dev/it/docs/advanced/parallel).

Con `proc_open`, `shell_exec`, `exec`, `system`, `passthru`, `popen` e `pcntl_fork` tutti disabilitati, la ricerca testuale con `jobs: 4`, la riscrittura AST, `greph-index build`, `greph-index ast-cache build` e `search`, oltre ai wrapper `rg` e `sg`, funzionano normalmente.

## Helper senza processi

Quando integrate gli helper di confronto in un host di questo tipo, createli specificando una policy che disabiliti i processi:

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

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

Queste istanze adottano un comportamento fail closed: ogni ricerca o comando genera un `RuntimeException` invece di tentare di avviare un processo.

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

Passatele ovunque sia accettato un `ToolResolver` o un `CommandRunner`, ad esempio negli argomenti `toolResolver:` e `commandRunner:` di `Greph\FeatureMatrix\FeatureMatrixGenerator`. Il generatore termina senza avviare processi, ma non può produrre un report utile: i controlli sugli strumenti a monte vengono indicati come `Unavailable` e quelli che eseguono gli eseguibili di Greph come `Fail`, perché ogni controllo è un comando. Generate la [matrice delle funzionalità](https://greph.inline0.dev/it/docs/advanced/feature-matrix) su una macchina che consente l’esecuzione di processi.
