
# 受进程限制的主机

共享主机、强化容器和某些 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()`、索引构建器和四个可执行文件都不会调用它们。

工作进程池会在派生进程前检查 `function_exists('pcntl_fork')`。对 PHP 而言，`disable_functions` 中列出的函数视为不存在，因此在此类主机上，每个块都会在进程内运行，结果与 `-j 1` 相同。另请参阅 [并行工作进程](https://greph.inline0.dev/zh/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/zh/docs/advanced/feature-matrix)。
