exec în PHP

Rulează o comandă a sistemului de operare și returnează ultima linie afișată de ea.

Sintaxă
exec(string $command, &$output = null, &$result_code = null): string|false

Ce face exec

exec pornește o comandă de terminal (de exemplu ls, convert, git) și așteaptă să se termine. Returnează doar ultima linie, dar dacă dai variabila $output, primești toate liniile într-un tablou. În $result_code primești codul de ieșire: 0 înseamnă succes.

Orice valoare venită de la utilizator trebuie trecută prin escapeshellarg înainte să ajungă în comandă. Pe multe găzduiri partajate, exec este dezactivat din disable_functions.

Parametri

Parametru Descriere
$command Comanda rulată.
$output Opțional. Variabilă în care se adaugă liniile afișate, fără \n la final.
$result_code Opțional. Variabilă în care se pune codul de ieșire al comenzii.

Ce returnează

Ultima linie afișată de comandă sau false dacă nu a putut fi pornită.

Exemple

Exemplul 1: Toate liniile și ultima linie

<?php
mkdir("poze");
touch("poze/a.jpg");
touch("poze/b.jpg");

$ultima = exec("ls poze", $linii, $cod);

print_r($linii);
echo "Ultima linie: $ultima\n";
echo "Cod de ieșire: $cod";

Rezultat

Array
(
    [0] => a.jpg
    [1] => b.jpg
)
Ultima linie: b.jpg
Cod de ieșire: 0

Exemplul 2: A reușit comanda?

Comanda test -f verifică existența unui fișier și nu afișează nimic. Rezultatul se vede doar în codul de ieșire, pe care îl cerem direct cu argumentul cu nume result_code:.

<?php
touch("backup.sql");

foreach (["backup.sql", "lipsa.sql"] as $fisier) {
    exec("test -f " . escapeshellarg($fisier), result_code: $cod);
    echo "$fisier: " . ($cod === 0 ? "există" : "lipsește (cod $cod)") . "\n";
}

Rezultat

backup.sql: există
lipsa.sql: lipsește (cod 1)

Greșeli frecvente

  • Pui text de la utilizator direct în comandă: exec("convert " . $_GET["poza"]). Cineva poate trimite a.jpg; rm -rf ~. Folosește escapeshellarg.
  • Refolosești aceeași variabilă $output în mai multe apeluri. exec adaugă liniile noi la cele vechi, nu le înlocuiește.
  • Comanda scrie erori pe stderr, iar acestea nu ajung în $output. Adaugă 2>&1 la finalul comenzii.

Comenzi înrudite

  • 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.