Proc_open သည် PHP တွင်လုပ်ဆောင်ချက်တစ်ခုဖြစ်ပြီး၎င်းသည်ကျွန်ုပ်တို့အားလုပ်ငန်းစဉ်တစ်ခုစတင်ရန်နှင့်၎င်းနှင့်အပြန်အလှန်ဆက်သွယ်သည်။ ၎င်းသည်သင့်အားကလေးဖြစ်စဉ်၏ထုတ်လုပ်မှုကိုဖတ်ရန်ခွင့်ပြုသည်, input ကိုရေးထည့်ပြီး, exec or shell_exec နှင့်မတူဘဲ proc_open သည် ပိုမိုအားကောင်းသောထိန်းချုပ်မှုများကိုပေးနိုင်သည်။
ပထမ ဦး စွာကလေးဖြစ်စဉ်ကိုစတင်ရန် Proc_open ကို သုံးရန်လိုအပ်သည်။ Proc_open ၏ပထမ ဦး ဆုံး pareter သည် command string ဖြစ်သည်။ ဒုတိယ parameter သည်ပိုက်လိုင်းပြုပြင်ခြင်းနှင့်တတိယနေ့သည်ကလေးဖြစ်စဉ်နှင့်အမှားများကိုလက်ခံရရှိလေ့ရှိသည်။
ဤတွင်ရိုးရှင်းသောဥပမာတစ်ခုဖြစ်သည်။
$cmd = "ls -l"; // သင်မည်သည့် command ကိုနှင့်အတူအစားထိုးနိုင်ပါတယ်
$descriptorspec = [
1 => ['pipe', 'w'], // စံ output ကို
2 => ['pipe', 'w'], // စံအမှား
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// ကလေးလုပ်ငန်းစဉ်၏ output ကိုဖတ်ပါ
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// 读取စံအမှား(ရှိလျှင်)
$error_output = stream_get_contents($pipes[2]);
fclose($pipes[2]);
// လုပ်ငန်းစဉ်ကိုပိတ်ပါ
$exit_code = proc_close($process);
echo "Output:\n" . $output . "\n";
if ($error_output) {
echo "Error Output:\n" . $error_output . "\n";
}
echo "Exit Code: " . $exit_code . "\n";
}
ဒီဥပမာမှာ LS -l command ကိုစပြီး Stream_get_contronts တွေကို stram_get_contents တွေကို သုံးတယ်။ Proc_open သည် ကျွန်ုပ်တို့အားလုပ်ဆောင်မှုကိုလုပ်ဆောင်နေစဉ်အတွင်းလုပ်ငန်းစဉ်နှင့် ဆက်သွယ်မှု ကိုပြုလုပ်ရန်ခွင့်ပြုသည်။
အချို့ဖြစ်ရပ်များတွင်ကလေးဖြစ်စဉ်ကိုအဆုံးသတ်ရန်လိုအပ်ပါကအထူးသဖြင့်ကလေးလုပ်ငန်းစဉ်သည်ကြာရှည်စွာပြေးနေလျှင်, Prot_terminate function ကိုအလုပ်လုပ်သောကလေးဖြစ်စဉ်ကိုရပ်ဆိုင်းရန်အသုံးပြုနိုင်သည်။
proc_terminate ကိုအသုံးပြုပြီး ဖြစ်စဉ်တစ်ခုရပ်စဲခြင်းဥပမာတစ်ခုမှာဤတွင်ဖြစ်သည်။
$cmd = "sleep 10"; // လုပ်ငန်းစဉ်ကိုအိပ်ပါစေ10စက်ဏန့်,ရှည်လျားသောပြေးလုပ်ငန်းစဉ်ကိုတုပရန်
$descriptorspec = [
1 => ['pipe', 'w'],
2 => ['pipe', 'w'],
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// 等待几စက်ဏန့်钟后终止子进程
sleep(3);
proc_terminate($process); // လုပ်ငန်းစဉ်၏အတင်းအဓမ္မရပ်စဲ
// output နှင့်အမှားများကိုဖတ်ပါ
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
$error_output = stream_get_contents($pipes[2]);
fclose($pipes[2]);
echo "Output after termination:\n" . $output . "\n";
if ($error_output) {
echo "Error Output:\n" . $error_output . "\n";
}
// လုပ်ငန်းစဉ်ထွက်ပေါက်ကုဒ်ကိုရယူပါ
$exit_code = proc_close($process);
echo "Exit Code: " . $exit_code . "\n";
}
ဤဥပမာတွင် အိပ်စက်ခြင်း 10 ကိုအသုံးပြုပြီးရှည်လျားသောပြေးလုပ်ငန်းစဉ်ကို simulated လုပ်ပြီး 3 စက္ကန့်အကြာတွင် proc_terminate နှင့်လုပ်ငန်းစဉ်ကိုအဆုံးသတ်လိုက်သည်။ ဤလုပ်ငန်းစဉ်ကိုရပ်တန့်ပြီးသည့်နောက်တွင်ကလေးဖြစ်စဉ်၏ထုတ်လွှင့်ခြင်းနှင့်အမှားများကိုကျွန်ုပ်တို့ရရှိနိုင်ကြောင်းသတိပြုပါ။
ယခင်အကြောင်းအရာများကိုပေါင်းစပ်ခြင်း, လုပ်ငန်းစဉ်တစ်ခုစတင်ရန်, output ကိုရယူရန်နှင့်လိုအပ်ပါကလုပ်ငန်းစဉ်ကိုအဆုံးသတ်ရန်နှင့်လုပ်ငန်းစဉ်ကိုအဆုံးသတ်ရန်နှင့်လုပ်ငန်းစဉ်ကိုအဆုံးသတ်ရန်နှင့်လုပ်ငန်းစဉ်ကိုအဆုံးသတ်ရန်နှင့်လုပ်ငန်းစဉ်ကိုအဆုံးသတ်ရန်နှင့်လုပ်ငန်းစဉ်ကိုအဆုံးသတ်ရန်ပြသခြင်းကိုပြသသည်ပြည့်စုံသောဥပမာတစ်ခုရှိသည်။
$cmd = "ping -c 4 google.com"; // စမ်းသပ်ခြင်းအဘို့အမိန့်တော်မူ၏,ping Google
$descriptorspec = [
1 => ['pipe', 'w'], // စံ output ကို
2 => ['pipe', 'w'], // စံအမှား
];
$process = proc_open($cmd, $descriptorspec, $pipes);
if (is_resource($process)) {
// လုပ်ငန်းစဉ်၏ output ကိုဖတ်ပါ
$output = stream_get_contents($pipes[1]);
fclose($pipes[1]);
// 读取စံအမှား输出
$error_output = stream_get_contents($pipes[2]);
fclose($pipes[2]);
// လုပ်ငန်းစဉ်ကိုပိတ်ပါ并获取退出代码
$exit_code = proc_close($process);
echo "Output:\n" . $output . "\n";
if ($error_output) {
echo "Error Output:\n" . $error_output . "\n";
}
echo "Exit Code: " . $exit_code . "\n";
}
ဤဥပမာတွင်ကွန်ယက်ချိတ်ဆက်မှုတစ်ခုကိုစမ်းသပ်ရန်နှင့် proc_open ကိုဖတ်ရန် Prown_open မှစတင်ရန် Ping command ကိုအသုံးပြုသည်။