Untuk PHP 7.4 atau lebih baharu, asingkan argumen perintah daripada persekitaran proses anak:

$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 dan $descriptorSpec berasal daripada pengendalian output sedia ada aplikasi. Semak kegagalan pelancaran, uruskan paip dan tutup proses melalui kitaran hayat itu.

array_replace(getenv(), ...) mengekalkan persekitaran induk sambil menggantikan kedua-dua nilai ini untuk anak. Semak pemboleh ubah proksi dan pintasan warisan huruf besar apabila ia boleh mengubah laluan yang dimaksudkan.

Tatasusunan argumen menghalang shell daripada mentafsir ampersand, tanda dolar atau ruang kelayakan. Tiada penetapan yang membawa akaun terbenam dalam perintah shell.

Contoh ini memilih curl kerana ia menyokong pemboleh ubah yang ditunjukkan. Alamat daripada senarai proksi HTTP boleh mengisi nilai persekitaran itu untuk laluan HTTP awam. Boleh laksana lain memerlukan antara muka proksi yang disokongnya sendiri; pilihan cURL PHP sendiri tidak mengkonfigurasi program luaran itu.

Artikel berkaitan