簡體   English   中英

PHP-帶foreach功能的網站變慢

[英]PHP - Function with foreach slowing down site

我正在開發一個連接到外部API的項目。 我已經建立了連接,並且已經實現了幾個函數來檢索數據,一切正常。

但是,以下功能完全可以正常工作,只是大大降低了我的網站速度(超過25秒)。

這是因為嵌套的foreach循環嗎? 我該怎么做才能重構代碼?

/**
 * @param $acti
 */
function getBijeenkomstenFromAct ($acti) {
    $acties = array();
    foreach ($acti as $act) {
        $bijeenkomsten = $this->getBijeenkomstenFromID($act['id']);
        if (in_array('Doorlopende activiteit', $act['type'])) {
            foreach ($bijeenkomsten as $bijeenkomst) {
                $acties[] = array(
                    'id'         => $act['id'],
                    'Naam'       => $act['titel'],
                    'interval'   => $act['interval'],
                    'activiteit' => $bijeenkomst['activiteit'],
                    'datum'      => $bijeenkomst['datum']
                );
            }
        } else {
            $acties[] = array (
                'id'            => $act['id'],
                'type'          => $act['type'],
                'activiteit'    => $act['titel'],
                'interval'      => $act['interval'],
                'dag'           => $act['dag'],
                'starttijd'     => $act['starttijd'],
                'eindtijd'      => $act['eindtijd']

            );
        }
    }
    return $acties;
}

函數“ getBijeenkomstenfromID”可以正常工作,其本身一點也不慢。 只是要確定,這是函數:

/**
 * @param $activitieitID
 *
 * @return mixed
 *
 */
public function getBijeenkomstenFromID($activitieitID) {
    $options = array(
        //'datumVan'      => date('Y-m-d'),
        'activiteit'    => array (
            'activiteit'    => $activitieitID
        ),
        'limit'     => 5,
        'datumVan'  => date(("Y-m-d"))
    );
    $bijeenkomsten = $this->webservice->activiteitBijeenkomstOverzicht($this->api_key, $options);

    return $bijeenkomsten;
}

好像您是在第一個foreach循環中調用API那樣,效率不高。

每次您這樣做:

$bijeenkomsten = $this->getBijeenkomstenFromID($act['id']);

由於必須忍受網絡延遲,因此您在腳本中增加了很多“停滯”時間,這是允許API實際完成工作並將其傳輸回給您的時間。 即使這可能很快(比如說總共100毫秒),但是如果您的第一個foreach循環迭代100次,則您已經累積了10秒的等待時間,而那是在getBijeenkomstenFromAct($ acti)進行任何實際處理之前。

如果可能的話,此處的最佳做法是將其拆分。 我的建議:

對於需要在API中查找的所有ID,使getBijeenkomstenFromID($ activitieitID)單獨異步運行。 這里的關鍵是使其作為單獨的進程運行,然后將其構造的數組傳遞給getBijeenkomstenFromAct,以便它可以快樂地循環和處理它。

所以是的,基本上我建議您為效率起見,將流程向后編排

看看curl_multihttp : //php.net/manual/en/function.curl-multi-exec.php

它可以讓您異步調用外部API並立即處理所有返回。 請注意,API通常在異步調用上有其自身的局限性,並且常識表明您可能不應該對網站進行200次單獨的調用。 但是,如果您的調用次數少於或少於一打(並且API允許),curl_multi會做得很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM