Para PHP 7.4 o posterior, mantenga separados los argumentos del comando y el entorno del proceso hijo:

$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 y $descriptorSpec provienen del manejo de salida existente de la aplicación. Compruebe si el lanzamiento falló, gestione las tuberías y cierre el proceso durante ese ciclo de vida.

array_replace(getenv(), ...) conserva el entorno del proceso padre mientras reemplaza estos dos valores para el hijo. Revise las variables heredadas de proxy y de omisión en mayúsculas cuando puedan cambiar la ruta prevista.

La matriz de argumentos evita que un shell interprete los ampersands, los signos de dólar o los espacios de las credenciales. No hay ninguna asignación que contenga cuentas incrustada en un comando de shell.

Este ejemplo elige curl porque admite las variables mostradas. Una dirección de la lista de proxies HTTP puede rellenar esos valores de entorno para una ruta HTTP pública. Un ejecutable diferente necesita su propia interfaz de proxy compatible; las opciones cURL de PHP no configuran ese programa externo.

Artículos relacionados