Eine Proxy-Umgebung an einen PHP-Unterprozess übergeben
Nutzen Sie proc_opens getrennte Umgebung und Argumentarray für einen Downloader und erhalten Sie geerbte Werte bewusst.
Ab PHP 7.4 sollten Sie die Befehlsargumente und die Umgebung des Kindprozesses getrennt halten:
$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 und $descriptorSpec stammen aus der vorhandenen Ausgabebehandlung der Anwendung. Prüfen Sie auf einen fehlgeschlagenen Start, verwalten Sie die Pipes und schließen Sie den Prozess über diesen Lebenszyklus.
array_replace(getenv(), ...) behält die Elternumgebung bei und ersetzt diese beiden Werte für das Kind. Prüfen Sie geerbte Proxy- und Bypass-Variablen in Großbuchstaben, wenn sie die beabsichtigte Route ändern könnten.
Das Argumentarray hindert eine Shell daran, Ampersands, Dollarzeichen oder Leerzeichen in Zugangsdaten zu interpretieren. In einem Shell-Befehl ist keine kontotragende Zuweisung eingebettet.
Dieses Beispiel wählt curl, weil es die gezeigten Variablen unterstützt. Eine Adresse aus der HTTP-Proxy-Liste kann diese Umgebungswerte für eine öffentliche HTTP-Route füllen. Eine andere ausführbare Datei benötigt ihre eigene unterstützte Proxy-Schnittstelle; die cURL-Optionen von PHP selbst konfigurieren dieses externe Programm nicht.