Ce face popen / pclose
popen pornește comanda și îți dă un singur canal către ea. Cu modul "r" citești ce afișează comanda, cu modul "w" îi trimiți date la intrare. Canalul se folosește cu fgets, fread, fwrite, ca un fișier, așa că poți prelucra ieșirea linie cu linie, fără să aștepți finalul comenzii.
pclose închide canalul, așteaptă terminarea comenzii și returnează codul ei de ieșire. Dacă ai nevoie de intrare și ieșire în același timp, folosește proc_open.
Parametri
| Parametru | Descriere |
|---|---|
$command |
Comanda rulată prin shell. |
$mode |
"r" pentru citire sau "w" pentru scriere (opțional cu b, de exemplu "rb"). |
Ce returnează
popen: un stream sau false. pclose: codul de ieșire al comenzii sau -1 la eroare.
Exemple
Exemplul 1: Ieșirea citită linie cu linie
<?php
$p = popen("printf 'Ana\nIon\nMaria\n'", "r");
$numar = 0;
while (($linie = fgets($p)) !== false) {
$numar++;
echo "$numar. $linie";
}
echo "Cod de ieșire: " . pclose($p);
Rezultat
1. Ana
2. Ion
3. Maria
Cod de ieșire: 0
Exemplul 2: Date trimise unei comenzi
Comanda sort primește numele prin canal și scrie rezultatul ordonat într-un fișier. pclose așteaptă terminarea, deci fișierul este complet după el.
<?php
$p = popen("sort > sortat.txt", "w");
foreach (["Maria", "Ana", "Ion"] as $nume) {
fwrite($p, "$nume\n");
}
pclose($p);
echo file_get_contents("sortat.txt");
Rezultat
Ana
Ion
Maria
Exemplul 3: Codul de ieșire din pclose
<?php
$p = popen("echo Verific backup-ul; exit 3", "r");
echo fgets($p);
$cod = pclose($p);
echo $cod === 0 ? "Totul e în regulă" : "Comanda a eșuat cu codul $cod";
Rezultat
Verific backup-ul
Comanda a eșuat cu codul 3
Greșeli frecvente
- Uiți
pclose. Procesul copil rămâne în urmă până la finalul scriptului, iar codul de ieșire se pierde. - Închizi stream-ul cu
fcloseîn loc depclose. Funcționează, dar nu primești codul de ieșire.
Comenzi înrudite
proc_open: Pornește un proces cu control complet: canale separate pentru intrare, ieșire și erori, director și variabile de mediu proprii.exec: Rulează o comandă a sistemului de operare și returnează ultima linie afișată de ea.shell_exec: Rulează o comandă prin shell și returnează tot ce a afișat, ca un singur text.escapeshellarg: Pune un text între ghilimele sigure, ca să poată fi folosit ca argument într-o comandă de shell.