popen / pclose în PHP

Pornește o comandă și returnează un stream din care citești ieșirea ei sau în care îi scrii date; pclose o închide.

Sintaxă
popen(string $command, string $mode)

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 de pclose. 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.