
# Hosts mit Prozesseinschränkungen

Shared Hosting, gehärtete Container und einige PaaS-Plattformen deaktivieren Prozessfunktionen über `disable_functions`. Die Such-, Umschreib- und Indexoperationen von Greph laufen im PHP-Prozess (parallele Scans starten nach Möglichkeit Kopien davon als Worker) und funktionieren daher auch dort.

## Was Prozesse startet

| Code | Funktion | Verwendet für |
|---|---|---|
| `Greph\Support\ToolResolver` | `shell_exec()` | Auffinden der externen `grep`-, `rg`-, `sg`- (oder `npm`-) und `gh`-Binärdateien auf dem `PATH` |
| `Greph\Support\CommandRunner` | `proc_open()` | Ausführen dieser Binärdateien und der Greph-Programme als Unterprozesse |
| `Greph\Parallel\WorkerPool` | `pcntl_fork()` | Parallele Worker für `-j N` / `jobs: N` |

`ToolResolver` und `CommandRunner` dienen ausschließlich den Vergleichswerkzeugen: dem Generator der Funktionsmatrix, dem Benchmark-Harness und dem Oracle-Test-Harness. `Greph::search*()`, `Greph::rewriteAst()`, die Index-Builder und die vier ausführbaren Programme rufen sie niemals auf.

Der Worker-Pool prüft `function_exists('pcntl_fork')`, bevor er einen Fork erstellt. Eine unter `disable_functions` aufgeführte Funktion existiert aus Sicht von PHP nicht. Auf einem solchen Host läuft daher jeder Chunk im selben Prozess und liefert dasselbe Ergebnis wie `-j 1`. Siehe [Parallele Worker](https://greph.inline0.dev/de/docs/advanced/parallel).

Wenn `proc_open`, `shell_exec`, `exec`, `system`, `passthru`, `popen` und `pcntl_fork` alle deaktiviert sind, laufen die Textsuche mit `jobs: 4`, AST-Rewrite, `greph-index build`, `greph-index ast-cache build` und `search` sowie die Wrapper für `rg` und `sg` normal weiter.

## Hilfsfunktionen ohne Prozessausführung

Wenn du die Vergleichshelfer in einen solchen Host einbindest, erstelle sie mit einer Richtlinie, die Prozessausführung ausdrücklich deaktiviert:

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

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

Diese Instanzen schlagen sicher fehl: Jede Suche oder jeder Befehl löst einen `RuntimeException` aus, statt einen Prozess zu starten.

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

Übergib sie überall dort, wo ein `ToolResolver` oder `CommandRunner` akzeptiert wird, zum Beispiel als Argumente `toolResolver:` und `commandRunner:` von `Greph\FeatureMatrix\FeatureMatrixGenerator`. Der Generator wird dann ohne Prozessstart ausgeführt, kann aber keinen brauchbaren Bericht erstellen: Suchen in den vorgelagerten Werkzeugen werden als `Unavailable` gemeldet, Suchen, die die eigenen ausführbaren Programme von Greph aufrufen, als `Fail`, da jede Suche ein Befehl ist. Erzeuge die [Funktionsmatrix](https://greph.inline0.dev/de/docs/advanced/feature-matrix) auf einem Rechner, auf dem Prozesse gestartet werden dürfen.
