Dalam PHP, fungsi exec() melaksanakan arahan dan mengembalikan output daripada stdout arahan itu. Walau bagaimanapun, jika arahan menulis kepada stderr, output ini tidak ditangkap oleh exec().
Untuk menangkap kedua-dua stdout dan stderr daripada arahan, anda boleh menggunakan fungsi proc_open(). proc_open() menyediakan tahap kawalan yang lebih tinggi ke atas proses pelaksanaan perintah, termasuk keupayaan untuk memaipkan strim stdin, stdout dan stderr arahan.
Contoh:
Mari kita pertimbangkan skrip shell berikut, test.sh, yang menulis kepada kedua-dua stderr dan stdout:
#!/bin/bash echo 'this is on stdout'; echo 'this is on stdout too'; echo 'this is on stderr' >&2; echo 'this is on stderr too' >&2;
Untuk melaksanakan skrip ini dalam PHP dan menangkap kedua-dua stdout dan stderr, anda boleh menggunakan kod berikut:
$descriptorspec = [ 0 => ['pipe', 'r'], // stdin 1 => ['pipe', 'w'], // stdout 2 => ['pipe', 'w'], // stderr ]; $process = proc_open('./test.sh', $descriptorspec, $pipes, dirname(__FILE__), null); $stdout = stream_get_contents($pipes[1]); fclose($pipes[1]); $stderr = stream_get_contents($pipes[2]); fclose($pipes[2]); echo "stdout : \n"; var_dump($stdout); echo "stderr :\n"; var_dump($stderr);
Output:
Apabila anda melaksanakan skrip PHP di atas, anda akan mendapat perkara berikut output:
stdout : string(40) "this is on stdout this is on stdout too" stderr : string(40) "this is on stderr this is on stderr too"
Output menunjukkan aliran stdout dan stderr daripada skrip test.sh.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menangkap Kedua-dua stdout dan stderr daripada Perintah Exec() dalam PHP?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!