跳转到正文

受进程限制的主机

共享主机、强化容器和某些 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 包装器都能正常运行。

禁用进程时的辅助工具

在此类主机中嵌入比较辅助工具时,请使用显式的进程禁用策略来构造它们:

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,因为每项探测都需要执行命令。请在允许启动进程的机器上生成功能矩阵。