PHP 7.4 以降では、コマンドの引数と子プロセスの環境を分けておきます。

$environment = array_replace(getenv(), [
    'http_proxy' => 'http://proxy.example:8080',
    'https_proxy' => 'http://proxy.example:8080',
]);

$process = proc_open(
    ['/usr/bin/curl', '--fail', '--max-time', '30',
     '--output', $outputFile, 'https://downloads.example/data.csv'],
    $descriptorSpec,
    $pipes,
    null,
    $environment
);

$outputFile と $descriptorSpec は、アプリケーションの既存の出力処理から取得します。起動に失敗していないか確認し、パイプを管理し、そのライフサイクルを通じてプロセスを閉じます。

array_replace(getenv(), ...) 親の環境を保持したまま、子プロセス用にこの 2 つの値を置き換えます。継承された大文字のプロキシ変数とバイパス変数が意図した経路を変える可能性がある場合は確認してください。

引数配列を使うと、シェルが認証情報のアンパサンド、ドル記号、空白を解釈しなくなります。シェルコマンドにアカウントを含む代入が埋め込まれることはありません。

この例では、示した変数をサポートする curl を選びます。HTTP プロキシ一覧のアドレスを、公開 HTTP 経路用にこれらの環境値へ設定できます。別の実行ファイルには、そのファイルが対応するプロキシインターフェースが必要です。PHP 自体の cURL オプションは、その外部プログラムを構成しません。

関連記事