
# Hosts com processos restritos

Hospedagem compartilhada, contêineres reforçados e algumas plataformas PaaS desativam funções de processo por meio de `disable_functions`. As operações de pesquisa, reescrita e indexação de Greph são executadas dentro do processo PHP (quando possível, as varreduras paralelas criam cópias de trabalho desse processo), então continuam funcionando nesses ambientes.

## O que inicia processos

| Código | Função | Uso |
|---|---|---|
| `Greph\Support\ToolResolver` | `shell_exec()` | Localizar os binários externos `grep`, `rg`, `sg` (ou `npm`) e `gh` no `PATH` |
| `Greph\Support\CommandRunner` | `proc_open()` | Executar esses binários e os executáveis Greph como subprocessos |
| `Greph\Parallel\WorkerPool` | `pcntl_fork()` | Trabalhadores paralelos para `-j N` / `jobs: N` |

`ToolResolver` e `CommandRunner` são usados apenas pelas ferramentas de comparação: o gerador da matriz de recursos, o conjunto de testes de benchmark e o conjunto de testes do oráculo. `Greph::search*()`, `Greph::rewriteAst()`, os construtores de índice e os quatro executáveis nunca os chamam.

O pool de trabalhadores verifica `function_exists('pcntl_fork')` antes de criar processos. Uma função listada em `disable_functions` não existe para PHP; portanto, em um host assim, cada bloco é executado no próprio processo, com o mesmo resultado de `-j 1`. Consulte [Trabalhadores paralelos](https://greph.inline0.dev/pt/docs/advanced/parallel).

Com `proc_open`, `shell_exec`, `exec`, `system`, `passthru`, `popen` e `pcntl_fork` todos desativados, a pesquisa de texto com `jobs: 4`, a reescrita de AST, `greph-index build`, `greph-index ast-cache build` e `search`, além dos wrappers `rg` e `sg`, continuam funcionando normalmente.

## Auxiliares sem processos

Ao incorporar os auxiliares de comparação em um host desse tipo, configure-os com uma política explícita de processos desativados:

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

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

Essas instâncias falham de forma segura: cada consulta ou comando lança um `RuntimeException` em vez de tentar iniciar um processo.

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

Passe-as onde quer que `ToolResolver` ou `CommandRunner` sejam aceitos, por exemplo, nos argumentos `toolResolver:` e `commandRunner:` de `Greph\FeatureMatrix\FeatureMatrixGenerator`. O gerador é concluído sem iniciar um processo, mas não consegue produzir um relatório útil: as sondagens das ferramentas upstream são indicadas como `Unavailable`, e as que executam os próprios executáveis de Greph como `Fail`, pois cada sondagem é um comando. Gere a [matriz de recursos](https://greph.inline0.dev/pt/docs/advanced/feature-matrix) em uma máquina que permita processos.
