
# プロセスが制限されたホスト

共有ホスティング、強化されたコンテナ、一部のPaaSプラットフォームでは、`disable_functions`を通じてプロセス関数が無効になっています。Grephの検索、書き換え、インデックス操作はPHPプロセス内で実行されるため、その環境でも動作します（並列スキャンでは可能な場合にワーカープロセスをフォークします）。

## プロセスを起動する処理

| コード | 関数 | 用途 |
|---|---|---|
| `Greph\Support\ToolResolver` | `shell_exec()` | `PATH`上で外部の`grep`、`rg`、`sg`（または`npm`）および`gh`のバイナリを特定する |
| `Greph\Support\CommandRunner` | `proc_open()` | これらのバイナリとGreph実行ファイルをサブプロセスとして実行する |
| `Greph\Parallel\WorkerPool` | `pcntl_fork()` | `-j N` / `jobs: N`用の並列ワーカー |

`ToolResolver`と`CommandRunner`は、比較ツール、つまり機能マトリクス生成ツール、ベンチマークハーネス、オラクルテストハーネスでのみ使用されます。`Greph::search*()`、`Greph::rewriteAst()`、インデックスビルダー、および4つの実行ファイルはこれらを呼び出しません。

ワーカープールはフォークする前に`function_exists('pcntl_fork')`を確認します。`disable_functions`に記載された関数はPHPからは存在しないものとして扱われるため、そのようなホストでは各チャンクがプロセス内で実行され、`-j 1`と同じ結果になります。[並列ワーカー](https://greph.inline0.dev/ja/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`を受け取る場所ならどこでも渡せます。たとえば、`Greph\FeatureMatrix\FeatureMatrixGenerator`の`toolResolver:`および`commandRunner:`引数です。これにより生成ツールはプロセスを起動せずに完了しますが、有用なレポートは生成できません。上流ツールへのプローブは`Unavailable`として報告され、Greph自身の実行ファイルを実行するプローブは`Fail`として報告されます。すべてのプローブがコマンドだからです。プロセスを許可するマシンで[機能マトリクス](https://greph.inline0.dev/ja/docs/advanced/feature-matrix)を生成してください。
