ฉันกำลังพยายามเข้าใจถึงความแตกต่างระหว่างshell_exec()
และexec()
...
ฉันมักจะใช้exec()
คำสั่งด้านเซิร์ฟเวอร์เสมอเมื่อไรฉันจะใช้shell_exec()
?
เป็นshell_exec()
เพียงชื่อย่อสำหรับexec()
? ดูเหมือนว่าจะเป็นสิ่งเดียวกันกับพารามิเตอร์ที่น้อยลง
ฉันกำลังพยายามเข้าใจถึงความแตกต่างระหว่างshell_exec()
และexec()
...
ฉันมักจะใช้exec()
คำสั่งด้านเซิร์ฟเวอร์เสมอเมื่อไรฉันจะใช้shell_exec()
?
เป็นshell_exec()
เพียงชื่อย่อสำหรับexec()
? ดูเหมือนว่าจะเป็นสิ่งเดียวกันกับพารามิเตอร์ที่น้อยลง
คำตอบ:
shell_exec
ส่งคืนเอาต์พุตสตรีมทั้งหมดเป็นสตริง exec
ส่งคืนบรรทัดสุดท้ายของเอาต์พุตตามค่าดีฟอลต์ แต่สามารถจัดเตรียมเอาต์พุตทั้งหมดเป็นอาร์เรย์ที่ระบุเป็นพารามิเตอร์ที่สอง
ดู
exec()
สามารถ [ทำ] ทุกอย่างshell_exec()
[สามารถ] และอื่น ๆ :) "
นี่คือความแตกต่าง หมายเหตุการขึ้นบรรทัดใหม่ในตอนท้าย
> shell_exec('date')
string(29) "Wed Mar 6 14:18:08 PST 2013\n"
> exec('date')
string(28) "Wed Mar 6 14:18:12 PST 2013"
> shell_exec('whoami')
string(9) "mark\n"
> exec('whoami')
string(8) "mark"
> shell_exec('ifconfig')
string(1244) "eth0 Link encap:Ethernet HWaddr 10:bf:44:44:22:33 \n inet addr:192.168.0.90 Bcast:192.168.0.255 Mask:255.255.255.0\n inet6 addr: fe80::12bf:ffff:eeee:2222/64 Scope:Link\n UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1\n RX packets:16264200 errors:0 dropped:1 overruns:0 frame:0\n TX packets:7205647 errors:0 dropped:0 overruns:0 carrier:0\n collisions:0 txqueuelen:1000 \n RX bytes:13151177627 (13.1 GB) TX bytes:2779457335 (2.7 GB)\n"...
> exec('ifconfig')
string(0) ""
หมายเหตุการใช้ที่ผู้ประกอบการ backtickshell_exec()
เป็นเหมือน
ปรับปรุง:ฉันควรอธิบายว่าสุดท้าย ดูคำตอบนี้หลายปีต่อมาแม้ว่าฉันจะไม่รู้ว่าทำไมมันถึงปล่อยออกมา! แดเนียลอธิบายไว้ข้างต้น - เป็นเพราะexec
คืนค่าบรรทัดสุดท้ายเท่านั้นและifconfig
บรรทัดสุดท้ายจะว่างเปล่า
2>&1
ในตอนท้ายของคำสั่งของคุณเพื่อเปลี่ยนเส้นทาง STDERR ไปยัง STDOUT หากคุณใช้เครื่อง linux
shell_exec
- ดำเนินการคำสั่งผ่านเปลือกและส่งกลับผลลัพธ์ที่สมบูรณ์เป็นสตริง
exec
- ดำเนินการโปรแกรมภายนอก
ความแตกต่างคือเมื่อshell_exec
คุณได้รับผลลัพธ์เป็นค่าส่งคืน
exec
ส่งคืนบรรทัดสุดท้ายของเอาต์พุต หากต้องการคุณสามารถเลือกที่จะส่งผ่านอาร์เรย์เป็นพารามิเตอร์ที่สองเพื่อจับเอาท์พุทที่สมบูรณ์และจำนวนเต็มเป็นพารามิเตอร์ที่สามเพื่อจับค่าส่งคืนของคำสั่งเชลล์ซึ่งสามารถใช้สำหรับการตรวจสอบข้อผิดพลาด ข้อเสียที่ใหญ่ที่สุดshell_exec
คือมันส่งคืนค่า null หากคำสั่งล้มเหลวหรือหากไม่สร้างเอาต์พุตใด ๆ ดังนั้นค่าส่งคืนจะไม่สามารถใช้สำหรับการตรวจสอบข้อผิดพลาดได้อย่างน่าเชื่อถือ
ความแตกต่างเล็กน้อยที่ไม่ได้สัมผัสที่นี่:
เปรียบเทียบ:
exec('ls', $out);
var_dump($out);
// Look an array
$out = shell_exec('ls');
var_dump($out);
// Look -- a string with newlines in it
ในทางกลับกันถ้าเอาต์พุตของคำสั่งคือ xml หรือ json การมีแต่ละบรรทัดเป็นส่วนหนึ่งของอาร์เรย์ไม่ใช่สิ่งที่คุณต้องการเนื่องจากคุณจะต้องประมวลผลอินพุตเป็นรูปแบบอื่นดังนั้นในกรณีนั้นให้ใช้ shell_exec .
มันก็คุ้มค่าที่จะชี้ให้เห็นว่า shell_exec เป็นนามแฝงสำหรับผู้ดำเนินการ backtic สำหรับผู้ที่เคยใช้ * ระวัง
$out = `ls`;
var_dump($out);
exec ยังสนับสนุนพารามิเตอร์เพิ่มเติมที่จะให้รหัสส่งคืนจากคำสั่งดำเนินการ:
exec('ls', $out, $status);
if (0 === $status) {
var_dump($out);
} else {
echo "Command failed with status: $status";
}
ดังที่บันทึกไว้ในหน้าคู่มือ shell_exec เมื่อคุณต้องการโค้ดส่งคืนจากคำสั่งที่ถูกเรียกใช้งานจริงคุณไม่มีทางเลือกนอกจากใช้ exec
exec
ให้คุณรับรหัสส่งคืนของคำสั่ง (ผ่าน&$return_var
พารามิเตอร์) ในขณะที่shell_exec
ไม่สามารถรับได้
date
ตัวอย่างที่ดีที่จะเห็นความแตกต่างคือการพยายามที่คำสั่งเหล่านี้:whoami
,ifconfig
,netstat
,