สำหรับ 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 เองไม่ได้กำหนดค่าโปรแกรมภายนอกนั้น

บทความที่เกี่ยวข้อง