2016-05-01 22 views
0

Ich bin mehrere PHP-Skripte, die eine while-Schleife haben. Dies beim Einfügen und Lesen von einer MySQL-Datenbank.Mehrere Registerkarten, mehrere während

Es ist ein langwieriger Prozess, so dass es bis zu 2 Stunden dauert. Was ich tun muss, ist das Skript in mehreren Registerkarten im selben Browser zu öffnen. Wenn ich dies tue und das Skript auf mehreren Tabs öffne, kann ich nicht mehr als 6 Tabs öffnen. jede Registerkarte, die über 6 ist, wird einfach geladen und zeigt nichts. Bei einem anderen Browser funktioniert es, aber wenn ich die 6 Tabs erreiche, tut es das gleiche.

Code:

<?php 
    ini_set('memory_limit', -1); 
    ob_implicit_flush(TRUE); 
    set_time_limit(0); 

    $sqlselect = "SELECT * FROM old_Users Where age < 18"; 
    $content2 = mysqli_query($conn,$sqlselect); 

    While($row = mysqli_fetch_assoc($content2)){ 
    $Sql = "INSERT INTO New_Table_Users('first_name','last_name','ID') VALUES('".$row["firstname"]."','".$row["lastname"]."','".$row["idd"]."'); 
    mysqli_query($conn,$sql); 
    } 
?> 

Das Problem ist nicht über die RAM, CPU, weil, wenn ich einen neuen Browser zu öffnen, es funktioniert, aber wenn ich versuche, den 7 'Th Tab zu öffnen es hält nur loading .. So 12 Tabs zu öffnen i2 Browser haben müsste jeweils 6 Tabs geöffnet haben sollte. ... jede Hilfe wäre wirklich

+0

2 Stunden? Warum führst du das nicht als Hintergrundprozess aus? Warum benutzt du überhaupt einen Browser? Ich denke, die 6 Registerkarten sind für 6 Threads? Bitte tun Sie es nicht so –

+0

Wenn es so lange dauert zu laufen, dann führen Sie es als Hintergrund-Task, nicht innerhalb des Webbrowsers –

+0

auch könnte das oben in einer Abfrage keine Schleife erforderlich gemacht werden. –

Antwort

0

Dagon Lösung ist der beste geschätzt werden, aber für den Fall, müssen Sie Sachen in PHP verarbeiten und immer noch in der Lage sein, in einem schnellen Tempo einzufügen.

Mit PDO (sorry nicht wie mysqli weder während), es schneller zu tun als Sie atmen. Dadurch werden alle Daten mit sehr wenigen Abfragen (Batches) eingefügt. Es könnte sogar mit nur einem Einsatz für alles sein.

WARNUNG: Diese Technik ist schnell, aber kennen Sie Ihre Grenzen. Es benötigt RAM oder verringert die Anzahl der gleichzeitigen Einsätze.

Abhängig von der Größe des Einfügevorgangs begrenzen Sie die Anzahl der gleichzeitigen Einfügungen abhängig von Ihrer RAM-Kapazität. Mit 3 Params, wie Sie haben (sehr sehr wenige), fügen Sie Chargen von 10000 Sounds sinnvoll ein. Probieren Sie verschiedene Möglichkeiten aus, um zu sehen, wie Ihre Datenbank und Ihr Server damit umgehen.

ini_set('memory_limit', -1); 
set_time_limit(0); 

$table = 'New_Table_Users'; // inserted table name 
$nb_max_insert = 10000; // number of maximum simultaneous insert 
$age=18;// param age 

$stmt = $conn->prepare("SELECT * FROM old_Users Where age < ?"); 
$stmt->bindParam(1, $age, PDO::PARAM_INT); // prepare binder 

try { 
    $stmt->execute(); 
    $result = $stmt->fetchAll(PDO::FETCH_ASSOC); 
} catch (PDOException $e) { 
    var_dump('error main'); 
} 

if (count($result) !== 0) { 

    $data = array();// extract needed data , yes you are using * in you query. mheeeee 
    foreach ($result as $key => $el) { 
     $row['first_name'] = $el['first_name']; 
     $row['last_name'] = $el['last_name']; 
     $row['ID'] = $el['ID']; 
     array_push($data, $row); 
    } 

    $batches = array_chunk($data, $nb_max_insert);// split data into batches 

    foreach ($batches as $key => $batch) { 

     foreach ($batch as $d) { 
      $question_marks[] = '(' . query_placeholders('?', sizeof($d)) . ')'; // create question_marks sequence for PDO 
      $insert_values = array_merge($insert_values, array_values($d));// what to insert 
     } 
     $sql = "INSERT INTO $table (" . implode(",", array_keys($row)) . ") VALUES " . implode(',', $question_marks); //concat the query 
     $stmt = $conn->prepare($sql); 
     try { 
      $stmt->execute($insert_values); 
     } catch (PDOException $e) { 
      var_dump('error batch'); 
     } 
    } 
} 

Anmerkung: Ich bin es mit Millionen von Zeilen in große Tabellen einzufügen, über PHP7 pThreads (12 CPU x 20 Kerne) die Grenze des Servers mit 1024 Asynchron-Verbindungen mit 3X 12Go RAID X4 SSD 1to erreichen. Also ich denke, es sollte auch für Sie arbeiten ....

Verwandte Themen