Pentru PHP 7.4 sau mai nou, țineți separate argumentele comenzii și mediul procesului copil:

$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 și $descriptorSpec provin din gestionarea existentă a ieșirii aplicației. Verificați dacă lansarea a eșuat, gestionați conductele și închideți procesul prin acel ciclu de viață.

array_replace(getenv(), ...) păstrează mediul părinte în timp ce înlocuiește aceste două valori pentru copil. Verificați variabilele moștenite de proxy și de ocolire scrise cu majuscule atunci când ar putea schimba ruta dorită.

Tabloul de argumente împiedică un shell să interpreteze ampersand-urile, semnele dolar sau spațiile din datele de autentificare. Nu există nicio atribuire care poartă cont încorporată într-o comandă de shell.

Acest exemplu alege curl pentru că acceptă variabilele prezentate. O adresă din lista de proxy HTTP poate completa acele valori de mediu pentru o rută HTTP publică. Un alt executabil are nevoie de propria interfață proxy acceptată; opțiunile cURL ale PHP nu configurează acel program extern.

Articole similare