2016-06-01 11 views
1

Ich versuche, Multi-Threading in PHP mit Pthread zu implementieren. Was ich tun möchte, ist, ich habe 50 CSV-Dateien mit vielen Zeilen zu arbeiten. Ich muss jede Zeile lesen und in die Datenbank einfügen, nachdem ich einige Validierungskriterien überprüft habe. Anstatt also jeweils eine Datei zu lesen, möchte ich 5 Threads gleichzeitig erstellen, die 5 verschiedene Dateien gleichzeitig verarbeiten. Wenn einer der Threads zuerst abgeschlossen wird, wird die nächste in der Warteschlange befindliche Datei diesem Thread hinzugefügt.Lesen Sie mehrere CSV-Dateien gleichzeitig (Multithreading) mit PHP Pthread

Für z. Ich habe 1X.CSV bis 50X.CSV Ich werde 5 Threads starten, um 1X.CSV zu 5X.CSV zu verarbeiten. Jetzt ist 3X.CSV ziemlich klein im Vergleich zu anderen vier Dateien. Also wird seine Verarbeitung zuerst vervollständigt. So wird der dritte Thread frei und es wird nach der nächsten in der Warteschlange befindlichen Datei, d. H. 6X.CSV, gesucht. Jeder Thread wird einzeln funktionieren.

Mein Problem ist, Wenn ich Multithreading ohne Dateien zu lesen, funktioniert es gut! Aber fopen() hilft mir nicht, Dateien in run() -Funktion zu lesen. Kann mir jemand sagen, wo ich falsch liege? Unten ist mein Code. Jede Hilfe würde sehr geschätzt werden.

class AsyncLongAction extends Thread 
{ 

    public function __construct($s,$file) 
    { 
     $this->s = $s; 
     $this->file = $file; 
     //echo $file."<BR>"; 
    } 

    public function run() 
    { 
    if($this->s) 
    { 
     printf("TID: %s is waiting for %s %s ...\n", $this->getCurrentThreadId(), $this->s, $this->file); 
     //sleep($this->s); 
     printf("%ss is over.\n<br>", $this->s); 

     $handle = fopen($this->file,"r"); 
     echo $handle; //It is not giving any result. 
     while(($filesop = fgetcsv($handle,1000,",")) != false) 
     { 
       $name = $filesop[0]; 
       $times = time(); 
       $sql = "<BR>".$name."---".$times."======".Thread::getCurrentThreadId(); 
       echo $sql; 
     } 
     fclose($handle); 
    } 
    } 
} 

$thread = array(); 
$files = glob("CSV/*"); // path is right, I have tried working with the same code without using pthread. 

foreach($files as $key=>$file) 
{ 
    $thread[] = new AsyncLongAction($key+1,$file); 
} 

$c= 0; 
foreach($thread as $st) 
{ 
    if($c < 3) 
     $st->start(); 
    $st->join(); 
    $c++; 
} 
+0

Versuchen Sie, $ $ this-> Datei zu echo es scheint, Sie nicht 'Datei 'innerhalb' fopen' Funktion innerhalb Thread –

+0

bereits versucht bekommen. Es kommt da drüben! –

Antwort

1

Sie starten einen Thread und sofort danach warten Sie, bis es fertig ist. Dann fängst du mit dem nächsten an und so weiter ... Tipp: Wenn du gerade eingeloggt hättest, hättest du diesen Fehler selbst gefunden.