Wie kann eine Zeitüberschreitung beim Importieren einer großen Datenmenge vermieden werden?

Ich muss Katalogdaten von einem externen Server importieren. Die Daten sind in Kategorien und dann in Elementen angeordnet.

Für die API sind folgende Aufrufe erforderlich: 1. Abrufen von Kategorien. 2. Abrufen von Kategorieelementen. 3. Abrufen von Elementdaten

Diese Aufgabe funktioniert einmal täglich mit einem Cron-Job. Der Katalog enthält ca. 5000 Artikel.

Artikel importieren ist in 3 Dateien eingekapselt: 1. Get Cats – bekommt alle Kategorien 2. Get Kategorie Artikel – erhält alle Artikel, erstellt jedes Element (cpt) und als Anrufe 3 3. Artikel Informationen erhalten – aktualisiert die Artikeldaten (benutzerdefinierte Felder )

egal was ich mache, bekomme ich irgendwann 504 Gateway Time-out Fehler.

Wie kann ich das umgehen?

Skript 1:

 false)); foreach ($cats as $cat) { if (get_field('disabled', 'svod_cat_'.$cat->term_id)) continue; $cat_id = get_field('cat_id', 'svod_cat_'.$cat->term_id); $curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, 'http://example.com/import_cat.php?cat_id='.$cat->term_id); curl_exec ($curl); curl_close ($curl); echo $res."
"; } svod_update_disabled_items($processed_items); ?>

Skript 2:

  results; } function svod_get_items($svod_cat, $wp_cat) { global $processed_items; $new = 0; $update = 0; $items = svod_get_items_list($svod_cat); echo "Got items list with ".count($items)." items
"; flush(); foreach ($items as $item) { if (($my_item = get_page_by_title( $item->VodTitle, OBJECT, 'svod_item')) == NULL) { $id = svod_create_new_item($item, $wp_cat); $new++; } else { $id= svod_update_item($my_item, $item, $wp_cat); $update++; } $url = "http://example.com/import_item.php?item_id=$id"; $curl = curl_init(); curl_setopt ($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $res = curl_exec ($curl); curl_close ($curl); $processed_items[] = $id; echo $item->vodId . " ".$res."
"; flush(); } echo "Done import; created $new, updated $update
"; flush(); } function svod_create_new_item($item, $wp_cat) { $my_post = array( 'post_title' => $item->VodTitle, 'post_content' => '', 'post_status' => 'publish', 'post_author' => 1, 'post_type' => 'svod_item' ); $pid = wp_insert_post($my_post); if (!is_wp_error($pid)) { wp_set_post_terms( $pid, array($wp_cat), 'svod_cat', true); update_field('field_55ec1ed404c0e', $item->VodId, $pid); } return $pid; } function svod_update_item($my_item, $item, $wp_cat) { wp_set_post_terms( $my_item->ID, array($wp_cat), 'svod_cat', true); update_field('field_55ec1ed404c0e', $item->VodId, $pid); return $my_item->ID; } $processed_items = array(); echo "Importing category ".$wp_cat.'
'; $cat_id = get_field('cat_id', 'svod_cat_'.$wp_cat); svod_get_items($cat_id, $wp_cat); ?>

Skript 3:

   $pid, 'post_content' => $info->VodDesc, ); // Update the post into the database wp_update_post( $my_post ); update_field('field_55ec08a2bc9bf', $info->VodReleaseYear, $pid ); update_field('field_55ec08a9bc9c0', $info->VodRating, $pid); update_field('field_55ec08c4bc9c1', $info->VodRunTime, $pid); update_field('field_55ec091bbc9c2', $info->VodPosterUrl, $pid); update_field('field_55ec15f4bc9c3', ($info->VodHD == 'true'), $pid); } $wp_vod_id = $_GET['item_id']; $vod_id = get_field('vod_id', $wp_vod_id); $info = svod_get_item_info($vod_id); svod_update_item($wp_vod_id, $info); echo "
Item updated !"; ?>

Solutions Collecting From Web of "Wie kann eine Zeitüberschreitung beim Importieren einer großen Datenmenge vermieden werden?"

Ich würde diese Operationen in mehrere Aktionen aufteilen . Wenn es unmöglich ist, es in einem Lauf zu beenden, wird es keine bessere Lösung geben. Die Hauptsache ist, wenn der Fehler durch das Zeitlimit des Client-Servers verursacht wird (nicht in der Lage, alle Daten rechtzeitig herunterzuladen) oder Ihr Server-Timeout (es können nicht alle Daten rechtzeitig verarbeitet werden). Eine andere bekannte Sache ist, welche Operation am zeitaufwendigsten ist. Skript 3?

Ich würde einige benutzerdefinierte DB-Tabellen erstellen. Führen Sie dann cronjob aus, um alle Kategorien herunterzuladen und speichern Sie sie in einer Tabelle, dann einen weiteren Cronjob, um die Artikelliste herunterzuladen. Und dann cronjob, das dauert alle 5 Minuten zum Beispiel 10 Artikel aus der Liste, und lade seine “Artikelinfo” herunter … bis jeder Artikel seine Infos hat. In diesem Moment haben Sie alle “Quell” -Daten vom Client-Server.

Danach können Sie einen weiteren Vorgang ausführen , um gespeicherte Daten zu verarbeiten und sie in Ihren WP zu importieren (wahrscheinlich nicht alle in großen Mengen, aber wiederum in mehrere Läufe aufgeteilt). Verarbeitete Objekte werden aus der Tabelle entfernt und wenn sie leer sind, wird der Import FERTIG ausgeführt. Wenn einige Fehler / Timeouts ausgeführt werden, verbleiben Elemente in der DB-Tabelle und warten bis zum nächsten Lauf. Nichts wird verloren gehen.

set_time_limit(0) deaktiviert die Zeitlimitprüfung und sollte das Problem lösen, wenn dies das eigentliche Problem ist. Sie können auch mehrere Anfragen gleichzeitig mit curl versuchen und verschicken, was die Dinge beschleunigen sollte.

Um Zeitüberschreitung zu vermeiden, ist die beste Option wp-cli. Wp-cli ist WordPress Kommandozeilenschnittstelle. Sie können Daten mit wp-cli exportieren / importieren.