လက်ရှိတည်နေရာ: ပင်မစာမျက်နှာ> နောက်ဆုံးရဆောင်းပါးများစာရင်း> curlti_multi_cloces တောင်းဆိုမှုဖြစ်စဉ်ကာလအတွင်းကြားဖြတ်နှောင့်ယှက်ခြင်းကိုတုံ့ပြန်ရန်နည်းလမ်း

curlti_multi_cloces တောင်းဆိုမှုဖြစ်စဉ်ကာလအတွင်းကြားဖြတ်နှောင့်ယှက်ခြင်းကိုတုံ့ပြန်ရန်နည်းလမ်း

gitbox 2025-05-29

PHP တွင် curl_multi function ကိုအသုံးပြုသောအခါ, သင်သည်ဘုံအခြေအနေကိုကြုံတွေ့ရသောအခါ, အပြိုင်အဆက်အသွယ်ပေါင်းစုံအပြောင်းအလဲပြုလုပ်နေစဉ်အတွင်း curl_multi_close () သည် လက်ရှိဆက်လက်ဖြစ်ပွားနေသောတောင်းဆိုမှုကိုနှောင့်ယှက်နိုင်သည်။ ဤပြ problem နာသည်တစ်ခါတစ်ရံပရိုဂရမ်ကိုတစ်ပြိုင်တည်းတောင်းဆိုမှုများကိုချောချောမွေ့မွေ့ချောချောမွေ့မွေ့ပြီးချောချောမွေ့မွေ့ပြုလုပ်ရန်ပျက်ကွက်သည်။ ထို့ကြောင့်ဤပြ problem နာကိုရှောင်ရန်သင့်လျော်သောအစီအမံများလိုအပ်သည်။ ဤဆောင်းပါးသည်တောင်းဆိုမှုဖြစ်စဉ်ကာလအတွင်း curl_multi_close ၏ပြ problem နာကိုမည်သို့ထိထိရောက်ရောက်ကိုင်တွယ်နိုင်မည်ကိုမိတ်ဆက်ပေးလိမ့်မည်။

curl_multi_close ဆိုတာဘာလဲ။

curl_mamulti_close () သည် Curl_multi_init မှဖန်တီးထားသော curl extribles ကိုပိတ်ရန် PHP ၏ဆံပင်ကောက်ကောက်တိုးချဲ့ခြင်းမှပေးသော function တစ်ခုဖြစ်သည်။ ၎င်း၏ function မှာအရင်းအမြစ်ကိုထုတ်လွှတ်ရန်ဖြစ်သည်။ သို့သော်တောင်းဆိုမှုဖြစ်စဉ်ကာလအတွင်း function ကိုကြိုတင်ခေါ်ဝေါ်ကြပါကမပြီးဆုံးသေးသောတောင်းဆိုမှုကိုနှောင့်ယှက်ရန်ဖြစ်နိုင်သည်။ ၎င်းသည်ဒေတာဆုံးရှုံးမှုသို့မဟုတ်မပြည့်စုံသောတောင်းဆိုမှုများကိုဖြစ်ပေါ်စေနိုင်သည်, ၎င်းသည်စနစ်၏တည်ငြိမ်မှုနှင့်စွမ်းဆောင်ရည်ကိုအကျိုးသက်ရောက်စေနိုင်သည်။

Code Page

ဤတွင်ရိုးရှင်းသော curl_mamulti တောင်းဆိုမှုဥပမာတစ်ခုဖြစ်သည်။

 <?php
// ဖြစ်ပေါ်လာခြင်း curl_multi လက်ကိုင်
$mh = curl_multi_init();

// မျိုးစုံဖန်တီးပါ cURL လက်ကိုင်
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// တစ်ခုချင်းစီကိုထည့်ပါ cURL လက်ကိုင်添加到 multi လက်ကိုင်中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// တောင်းဆိုမှုများအားလုံးကိုလုပ်ဆောင်ပါ
$running = null;
do {
    $mrc = curl_multi_exec($mh, $running);
} while ($running > 0);

// ပြန်လာသောဒေတာကိုရယူပါ
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// ရုပ်သိမ်းခြင်း cURL လက်ကိုင်
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// ရုပ်သိမ်းခြင်း multi လက်ကိုင်
curl_multi_close($mh);
?>

ဒီဥပမာမှာ curl_multi_add_add_addle () မှတဆင့်လက်ကိုင် $ MH ကိုလက်ကိုင် $ MH အတွက် curl furlles အများကြီးထည့်သွင်းနှင့် curl_mamulti_exec မှတဆင့်တောင်းဆိုမှုများအားလုံးကို execute ။ နောက်ဆုံးအနေဖြင့်ကျွန်ုပ်တို့သည်လက်ကိုင်ကို curl_multi_remove_handle () နှင့် curl_mamulti_close () နှင့် curl_mamulti_close () ကို ပိတ်လိုက်သည်။

ပြနာပေါ်လာတယ်

curl_multi_close () ကိုဟုခေါ်သောကြောင့်ပြ problem နာမှာမူကိုင်တွယ်မှုမျိုးစုံကိုကြိုတင်မဲမျိုးစုံကိုပိတ်နိုင်ပြီး, တောင်းဆိုမှုများအားလုံးကိုမပြီးဆုံးပါကကြားဖြတ်ချက်အရတွေ့ရှိပါကမပြီးဆုံးသေးသောတောင်းဆိုမှုသည်တုန့်ပြန်မှုအချက်အလက်များသို့မဟုတ်ရလဒ်များကိုပြန်လည်ပေးပို့ခြင်းကိုရယူနိုင်မည်မဟုတ်ပါ။

ကြားဖြတ်နှောင့်ယှက်မှုများကိုမည်သို့ရှောင်ရှားနိုင်မည်နည်း။

curl_multi_close () ကိုသေချာစေရန်တောင်းဆိုချက်ကိုမနှောင့်ယှက်ရန်အောက်ပါနည်းလမ်းများကိုအသုံးပြုနိုင်သည်။

1 ။ curl_multi_close မခေါ်မီတောင်းဆိုမှုများအားလုံးကိုပြီးစီးကြောင်းသေချာပါစေ။

အသုံးအများဆုံးဖြေရှင်းနည်းမှာတောင်းဆိုမှုများအားလုံးကိုပြီးစီးပြီး curl_mamulti_close () ဟုခေါ်ရန်သေချာစေရန်ဖြစ်သည်။ သင်တောင်းဆိုမှုများအားလုံးကိုပြီးစီးခြင်းရှိမရှိဆုံးဖြတ်ရန် curl_multi_exec () ၏ပြန်လာတန်ဖိုးကိုသင်အသုံးပြုနိုင်သည်။ runvariable variable ၏တန်ဖိုး 0 သည် 0 ကိုဆိုလိုသည်, ဆိုလိုသည်မှာတောင်းဆိုမှုများအားလုံးကိုပြီးစီးခဲ့သည်။ သို့မှသာ curl_multi_close () ကိုခေါ်သည်။

ပြုပြင်ထားသောကုဒ်သည်အောက်ပါအတိုင်းဖြစ်သည် -

 <?php
// ဖြစ်ပေါ်လာခြင်း curl_multi လက်ကိုင်
$mh = curl_multi_init();

// မျိုးစုံဖန်တီးပါ cURL လက်ကိုင်
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// တစ်ခုချင်းစီကိုထည့်ပါ cURL လက်ကိုင်添加到 multi လက်ကိုင်中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// တောင်းဆိုမှုများအားလုံးကိုလုပ်ဆောင်ပါ
$running = null;
do {
    $mrc = curl_multi_exec($mh, $running);
    // နှေးနှေးနှေးနှေးနှေးနှေးကွေးနေသည် CPU အသုံးပြုမှုနှုန်း
    usleep(100);
} while ($running > 0);

// ပြန်လာသောဒေတာကိုရယူပါ
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// ရုပ်သိမ်းခြင်း cURL လက်ကိုင်
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// ရုပ်သိမ်းခြင်း multi လက်ကိုင်
curl_multi_close($mh);
?>

တောင်းဆိုမှု သည်လုပ်မလုပ် သည့်အထိ အစဉ်မပြတ် ကွပ်မျက်ခံရစဉ်အတွင်းကွင်းဆက်မှတစ်ဆင့်ဆက်လုပ်ပါ။

2 ။ အမှားကိုဖမ်းပြီးထပ်ကြိုးစားပါ

တစ်ခါတစ်ရံတွင်တောင်းဆိုမှုများအားလုံးကိုပြီးဆုံးသွားသော်လည်းကွန်ယက်ပြတ်တောက်မှုများကဲ့သို့သောပြ problems နာများကြောင့်သူတို့ပြတ်တောက်သွားနိုင်သည်။ ဤအချိန်တွင်တောင်းဆိုမှုပျက်ကွက်သည့်အခါသင်ပြန်လည်ကြိုးစားခြင်းကိုသင်စဉ်းစားနိုင်သည်။

 <?php
// Retry Times အများဆုံးအရေအတွက်ကိုသတ်မှတ်ပါ
$maxRetries = 3;

function performRequest($ch, $maxRetries) {
    $retryCount = 0;
    $response = null;
    while ($retryCount < $maxRetries) {
        $response = curl_exec($ch);
        if ($response !== false) {
            break;
        }
        $retryCount++;
        usleep(500000); // နောက်တဖန်မကြိုးစားမီခဏစောင့်ပါ
    }
    return $response;
}

// ဖြစ်ပေါ်လာခြင်း curl_multi လက်ကိုင်
$mh = curl_multi_init();

// မျိုးစုံဖန်တီးပါ cURL လက်ကိုင်
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// တစ်ခုချင်းစီကိုထည့်ပါ cURL လက်ကိုင်添加到 multi လက်ကိုင်中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// တောင်းဆိုမှုများအားလုံးကိုလုပ်ဆောင်ပါ
$running = null;
do {
    $mrc = curl_multi_exec($mh, $running);
} while ($running > 0);

// ပြန်လာသောဒေတာကိုရယူပါ,ထပ်ကြိုးစားပါ
$response1 = performRequest($ch1, $maxRetries);
$response2 = performRequest($ch2, $maxRetries);

// ရုပ်သိမ်းခြင်း cURL လက်ကိုင်
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// ရုပ်သိမ်းခြင်း multi လက်ကိုင်
curl_multi_close($mh);
?>

အထက်ဖော်ပြပါကုဒ်များတွင်အမြင့်ဆုံးပြန် စာရင်း မရောက်မှီတိုင်အောင်တောင်းဆိုမှုပျက်ကွက်သောအခါတောင်းဆိုမှုသည်ပျက်ကွက်သည့်အခါကြိုးစားခြင်းသည်ပြန်လည်ကြိုးစားသည်။ ၎င်းသည်ကွန်ရက်ပြ problems နာများကြောင့်တောင်းဆိုမှုပြတ်တောက်မှုများကိုထိရောက်စွာရှောင်ရှားနိုင်သည်။

3 ။ curl_multi_select () ကို သုံးပါ။

curl_mamulti_select () PHP အစီအစဉ်များသည်တောင်းဆိုမှုများကိုပိုမိုထိရောက်စွာကိုင်တွယ်နိုင်အောင်ကူညီနိုင်ပြီး curl_multi_exec () ကို curl_multi_exec () ကိုရှောင်ရှားရန်ကူညီနိုင်သည်။ ၎င်းသည်အချို့သောအခြေအနေများနှင့်ကိုက်ညီမှုရှိသည့်အခါ၎င်းသည်စနစ်အရင်းအမြစ်များကိုသိမ်းဆည်းနိုင်သည့်အတွက်တောင်းဆိုမှုကိုဆက်လက်လုပ်ဆောင်သွားမည်ဖြစ်သည်။

 <?php
// ဖြစ်ပေါ်လာခြင်း curl_multi လက်ကိုင်
$mh = curl_multi_init();

// မျိုးစုံဖန်တီးပါ cURL လက်ကိုင်
$ch1 = curl_init("http://gitbox.net/api/data1");
$ch2 = curl_init("http://gitbox.net/api/data2");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// တစ်ခုချင်းစီကိုထည့်ပါ cURL လက်ကိုင်添加到 multi လက်ကိုင်中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// တောင်းဆိုမှုများအားလုံးကိုလုပ်ဆောင်ပါ
$running = null;
do {
    curl_multi_select($mh);
    $mrc = curl_multi_exec($mh, $running);
} while ($running > 0);

// ပြန်လာသောဒေတာကိုရယူပါ
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// ရုပ်သိမ်းခြင်း cURL လက်ကိုင်
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

// ရုပ်သိမ်းခြင်း multi လက်ကိုင်
curl_multi_close($mh);
?>

curl_multi_select () မရရှိနိုင်သည့်အချက်အလက်များမရှိပါကစောင့်ဆိုင်းနိုင်သော်လည်းမလိုအပ်သော CPU အသုံးပြုမှုကိုရှောင်ရှားနိုင်သည်။ ၎င်းသည်အထူးသဖြင့်တောင်းဆိုမှုများစွာရှိသည့်အခါ၎င်းသည်ပိုမိုထိရောက်သောနည်းလမ်းဖြစ်သည်။