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 trimitea.jpg; rm -rf ~. Foloseșteescapeshellarg. - Refolosești aceeași variabilă
$outputîn mai multe apeluri.execadaugă liniile noi la cele vechi, nu le înlocuiește. - Comanda scrie erori pe
stderr, iar acestea nu ajung în$output. Adaugă2>&1la 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.