Per PHP 7.4 o successivo, tenete separati gli argomenti del comando e l'ambiente del processo figlio:

$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 e $descriptorSpec provengono dalla gestione dell'output già presente nell'applicazione. Verificate l'eventuale avvio fallito, gestite le pipe e chiudete il processo lungo quel ciclo di vita.

array_replace(getenv(), ...) conserva l'ambiente padre mentre sostituisce questi due valori per il figlio. Rivedete le variabili proxy e di bypass ereditate in maiuscolo quando potrebbero cambiare il percorso previsto.

L'array di argomenti impedisce a una shell di interpretare gli ampersand, i segni del dollaro o gli spazi delle credenziali. Nessuna assegnazione che porta account è incorporata in un comando di shell.

Questo esempio sceglie curl perché supporta le variabili mostrate. Un indirizzo dalla lista di proxy HTTP può riempire quei valori d'ambiente per una rotta HTTP pubblica. Un eseguibile diverso richiede la propria interfaccia proxy supportata; le opzioni cURL di PHP non configurano quel programma esterno.

Articoli correlati