Wordpress - цикл file_get_contents временно выключает домашнюю страницу - альтернатива?

-1

У меня есть следующая проблема: в функции я помещаю массив с не менее чем 700 именами. Я получаю массив со всей информацией об их выпусках за последние 10 дней.

Функция получает через iTunes API ответ json, который я хочу использовать для дальнейших анализов.

Проблема: при выполнении функции для ее завершения требуется около 3 минут. - домашняя страница недоступна для других, а я ее выполняю: (Ошибка на сервере: (70007) Указанный тайм-аут истек: AH01075: Ошибка отправки запроса на: (опрос)) → Запуск из памяти?

Вопросы: как повысить эффективность этой функции? - как закодировать эту функцию, не используя много памяти, я должен использовать unset (...)??

Код:

function getreleases($artists){
#   print_r($artists);
    $releases = array();
    foreach( $artists as $artist){
        $artist = str_replace(" ","%20",$artist);
        $ituneslink = "https://itunes.apple.com/search?term=".$artist."&media=music&entity=album&limit=2&country=DE";
        $itunesstring = file_get_contents($ituneslink);
        $itunesstring = json_decode($itunesstring);
        /*Results being decoded from json to an array*/
        if( ($itunesstring -> resultCount)>0 ){
            foreach ( $itunesstring -> results as $value){          
                if( (date_diff(date_create('now'), date_create( ($value -> releaseDate )))->format('%a')) < 10) {
                    #echo '<br>Gefunden: ' . $artist;
                    $releases[] = $value;
                }
            }
        }else{
            echo '<br><span style="color:red">Nicht gefunden bei iTunes: ' . $artist .'</span>';
        }
        unset($ituneslink);
        unset($itunesstring);
        unset($itunesstring2);
    }
    return $releases;
}
Теги:
server
out-of-memory
file-get-contents

2 ответа

0

Но проблема не устранена. Обновляя материал и получая 700 элементов из iTunes API, а во время работы в цикле, на домашней странице выходит из памяти. хотя домашняя страница недоступна с моего компьютера. Я просто пытался использовать "тайм-аут" или "спать", так как скрипт ищет вещи каждые несколько секунд. Но это не меняет.

Я просто улучшил: изменил "foreach" на "for" из-за соображений памяти. Теперь переменные не копируются. Есть ли еще проблемы: -/?? У меня там есть циклы. Может быть, $ itunesstring копируется?

if(!function_exists('get_contents')){
    function get_contents(&$url){
     // if cURL is available, use it...
                $ch = curl_init($url);
                curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                curl_setopt($ch, CURLOPT_HEADER, 0);
                curl_setopt($ch, CURLOPT_TIMEOUT, 10);
                $cache = curl_exec($ch);
                curl_close($ch);
        return $cache;
    }
}  

  function getfromituneslink(&$link,&$name){
        $name = str_replace("'","",$name);
        $name = substr($name, 0, 14);
        $result = get_transient("getlink_itunes_{$name}");
        if(false === $result){
            $result = get_contents($link);      
            set_transient("getlink_itunes_{$name}",$result, 12*HOUR_IN_SECONDS);
        }
        return $result;
    }



    function getreleases(&$artists){
        $releases= array();
        while( 0 < count($artists)){    
            $itunesstring = array();
            $artist = array_shift($artists);
            $artist = str_replace(" ","%20",$artist);
            $ituneslink = "https://itunes.apple.com/search?term=".$artist."&media=music&entity=album&limit=2&country=DE";
            $itunesstring = getfromituneslink($ituneslink,$artist);
            unset($ituneslink);
            $itunesstring = json_decode($itunesstring);

            if( ($itunesstring -> resultCount)>0 ){
                    #for($i=0; $i< (count($itunesstring -> results))-1; ++$i) 
                while( 0 < count(($itunesstring -> results))){  
                    $value = array_shift($itunesstring -> results);
                    #$value =  &$itunesstring[results][$i];
                    #foreach ( $itunesstring -> results as $value)
                    if( (date_diff(date_create('now'), date_create( ($value -> releaseDate )))->format('%a')) < 6) {
                        $releases[] =  array($value->artistName, $value->collectionName, $value->releaseDate, str_replace("?uo=4","",$value -> collectionViewUrl));
                        unset($value);
                    }
                }
            }else{
                echo '<br><span style="color:red">Nicht gefunden bei iTunes: ' . str_replace("%20"," ",$artist) .'</span>';
            }
            unset($ituneslink);
            unset($itunesstring);
        }
        return $releases;
    }

Я не знаю, где проблема. :-( Любая другая возможность позволить функции работать для получения информации друг за другом

0

Проблема заключается в том, что каждый раз, когда эта функция выполняется, вашему серверу необходимо сделать 700+ API-вызовы, проанализировать данные и выполнить свою логику на нем.

Одним из возможных решений является использование переходных процессов Wordpress для "кэширования" значения (или, возможно, даже всего вывода), таким образом, ему не придется выполнять эту напряженную функцию в каждом соединении, он просто вытащит данные из переходного процесса, Вы можете установить дату истечения срока действия, чтобы вы могли обновить информацию каждые X дней/часов.

Взгляните на эту статью из CSS Tricks, которая проведет вас через простой пример с использованием переходных процессов.

  • 0
    Эй, спасибо. Я только что реализовал функцию для переходного процесса.
  • 0
    Это решило вашу проблему?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню