
# 프로세스 제한 호스트

공유 호스팅, 보안이 강화된 컨테이너 및 일부 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')`을 확인합니다. `disable_functions`에 나열된 함수는 PHP에서 존재하지 않는 것으로 간주되므로, 그런 호스트에서는 모든 청크가 `-j 1`와 동일한 결과로 프로세스 내에서 실행됩니다. [병렬 작업자](https://greph.inline0.dev/ko/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/ko/docs/advanced/feature-matrix)를 생성하세요.
