Самый эффективный способ перебрать огромный объем данных, поступающих из API и импортировать в WordPress? - PullRequest
0 голосов
/ 18 июня 2019

Я использую запрос PHP cURL для получения большого количества данных (футбольных матчей) из API (10000 строк и растет). Я собираю все сразу как массив, а затем зацикливаюсь на всем этом. Затем проверяется каждая строка (совпадение), чтобы увидеть, есть ли у нее соответствующий пост, который уже существует в WordPress Если это так, то оно пропускается - если нет, то оно импортируется как новое сообщение.

Мне пришлось увеличить множество переменных PHP, чтобы он работал, но он становится неустойчивым из-за огромного количества данных. Мне интересно, какой самый эффективный способ разбить это на более мелкие куски был бы?

API позволяет передавать параметр "page". Можно ли разделить вызов на более мелкие куски, используя параметр страницы, при этом гарантируя, что PHP не прекратит работу? Будут ли отдельные запросы javascript AJAX более эффективными? Ищите то, что наиболее эффективно с точки зрения сервера.

private function syncMatches($event_id) {

    $get_matches = $this->API->GetMatches($event_id);

    foreach ($get_matches as $key => $match) {

        $match_id        = isset($match->MatchID) ? $match->MatchID : null;
        $match_event_id  = isset($match->EventID) ? $match->EventID : null;
        $match_date      = isset($match->EventDate) ? $match->EventDate : null;
        $match_away_team = isset($match->AwayTeamNameFull) ? $match->AwayTeamNameFull : null;
        $match_home_team = isset($match->HomeTeamNameFull) ? $match->HomeTeamNameFull : null;

        if (!$match_id || !$match_date || !$match_away_team || !$match_home_team) {
            continue;
        }

        $post_name = $match_date . ' - ' . $match_away_team . ' @ ' . $match_home_team;
        $post_id   = $this->existingRowHandler('match', 'match_id', $match_id);

        if ($post_id !== 0) {
            continue;
        }

        $post_meta = $this->createPostMeta($match);
        $insert_id = $this->insertPost($post_id, $post_name, 'match', $match_id, $post_meta);

    }

    return time();

    die();

}

1 Ответ

0 голосов
/ 18 июня 2019

Я бы попробовал сделать начальный вызов API, чтобы получить общее количество элементов. Затем выполните несколько вызовов cURL, чтобы получить данные в файл или несколько файлов. Затем либо получите данные из файла, либо из нескольких файлов, если хотите разбить их.

Вот пример с созданием нескольких файлов:


function get_total_count() {

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, 'https://yourapiurl/?page=1');

    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $data = json_decode(curl_exec($ch));

    curl_close($ch);

    // Get the total count

    $item_total = $data->totalCount;

    $page_count = $item_total / 1000; // Use whatever number you want to break it up by

    /* 
     * Round the page count up so if we get a page count with decimals we make sure to get the 
     * final page
     */

    $total_pages = ceil($page_count);

    // Return the final page count number

    return $total_pages;


}



function create_json_files() {

    // Get the number of pages in the report
    $report_pages = get_total_count();

    // Create an array range for the page count
    $pages = range(1, $report_pages);

    // Create array for the json files that will be created
    $json_files = array();

    // For each page in the report_pages array we'll create json file with data returned from the report

    foreach ($pages as $page) {

    $ch = curl_init();

    // Get each page of the smartsheet report

    curl_setopt($ch, CURLOPT_URL, 'https://yourapiurl/?page=' . $page);


    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $data = curl_exec($ch);

    curl_close($ch);

    // Name the file we will write to so we can push it to an array

    $file_name = "game_json_" . $page . ".json";    

    // Write data to the file   
    $the_file = fopen("game_json_" . $page . ".json", "w");
    fwrite($the_file, $data);
    fclose($the_file);

    // Add the new json file to the json files array    
    array_push($json_files, $file_name);

    }

    // Return the json files array to be used for other actions

    return $json_files;

}

function do_stuff_with_your_data() {

   $data_files = create_json_files();

   foreach($data_files as $file) {

      // Do stuff with your data

   }

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...