
# Alojamientos con restricciones de procesos

El alojamiento compartido, los contenedores reforzados y algunas plataformas PaaS desactivan las funciones de procesos mediante `disable_functions`. Las operaciones de búsqueda, reescritura e indexación de Greph se ejecutan dentro del proceso de PHP (cuando es posible, los análisis paralelos bifurcan copias de trabajo), así que siguen funcionando en esos entornos.

## Qué inicia procesos

| Código | Función | Uso |
|---|---|---|
| `Greph\Support\ToolResolver` | `shell_exec()` | Localizar los binarios externos `grep`, `rg`, `sg` (o `npm`) y `gh` en `PATH` |
| `Greph\Support\CommandRunner` | `proc_open()` | Ejecutar esos binarios y los ejecutables de Greph como subprocesos |
| `Greph\Parallel\WorkerPool` | `pcntl_fork()` | Trabajadores paralelos para `-j N` / `jobs: N` |

`ToolResolver` y `CommandRunner` solo se usan en las herramientas de comparación: el generador de la matriz de funciones, el arnés de pruebas de rendimiento y el arnés de pruebas del oráculo. `Greph::search*()`, `Greph::rewriteAst()`, los generadores del índice y los cuatro ejecutables nunca los llaman.

El grupo de trabajadores comprueba `function_exists('pcntl_fork')` antes de bifurcar. Una función incluida en `disable_functions` no existe para PHP, así que en un host de ese tipo cada fragmento se ejecuta en el mismo proceso y produce el mismo resultado que `-j 1`. Consulta [Trabajadores paralelos](https://greph.inline0.dev/es/docs/advanced/parallel).

Con `proc_open`, `shell_exec`, `exec`, `system`, `passthru`, `popen` y `pcntl_fork` desactivados, la búsqueda de texto con `jobs: 4`, la reescritura de AST, `greph-index build`, `greph-index ast-cache build` y `search`, y los envoltorios `rg` y `sg` funcionan con normalidad.

## Ayudantes sin procesos

Al integrar los ayudantes de comparación en un host de ese tipo, créelos con una política explícita que desactive los procesos:

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

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

Estas instancias fallan de forma segura: cada consulta o comando lanza un `RuntimeException` en vez de intentar iniciar un proceso.

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

Páselos donde se acepte un `ToolResolver` o `CommandRunner`, por ejemplo, en los argumentos `toolResolver:` y `commandRunner:` de `Greph\FeatureMatrix\FeatureMatrixGenerator`. El generador termina sin iniciar un proceso, pero no puede producir un informe útil: las comprobaciones de las herramientas originales se indican como `Unavailable` y las que ejecutan los propios ejecutables de Greph, como `Fail`, porque todas las comprobaciones son comandos. Genere la [matriz de funciones](https://greph.inline0.dev/es/docs/advanced/feature-matrix) en una máquina que permita ejecutar procesos.
