受进程限制的主机
共享主机、强化容器和某些 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 相同。另请参阅 并行工作进程。
在 proc_open、shell_exec、exec、system、passthru、popen 和 pcntl_fork 全部禁用时,使用 jobs: 4 的文本搜索、AST 重写、greph-index build、greph-index ast-cache build 和 search,以及 rg 和 sg 包装器都能正常运行。
禁用进程时的辅助工具
在此类主机中嵌入比较辅助工具时,请使用显式的进程禁用策略来构造它们:
use Greph\Support\CommandRunner;
use Greph\Support\ToolResolver;
$toolResolver = ToolResolver::processDisabled();
$commandRunner = CommandRunner::processDisabled();
这些实例会以失败关闭:每次查找或执行命令都会抛出 RuntimeException,而不会尝试启动进程。
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,因为每项探测都需要执行命令。请在允许启动进程的机器上生成功能矩阵。