Передача окружения прокси дочерней команде PHP
Используйте отдельное окружение и массив аргументов proc_open для одного загрузчика, намеренно сохраняя унаследованные значения.
Начиная с 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(), ...) сохраняет родительское окружение, заменяя эти два значения для дочернего процесса. Проверьте унаследованные переменные прокси и обхода, записанные заглавными буквами, если они могут изменить предполагаемый маршрут.
Массив аргументов не даёт оболочке интерпретировать амперсанды, знаки доллара или пробелы в учётных данных. В команде оболочки нет встроенного присваивания, несущего учётную запись.
В этом примере выбран curl, поскольку он поддерживает показанные переменные. Адрес из списка HTTP-прокси может заполнить эти значения окружения для публичного HTTP-маршрута. Другому исполняемому файлу нужен собственный поддерживаемый интерфейс прокси; собственные параметры cURL в PHP не настраивают эту внешнюю программу.