2016-06-01 11 views
1

pthreadを使用してPHPでマルチスレッドを実装しようとしています。 私がやってみたいのは、たくさんの行がある50のCSVファイルがあります。いくつかのバリデーション基準をチェックした後、各行を読み込んでデータベースに挿入する必要があります。そのため、一度に1つのファイルを読み込む代わりに、同時に5つの異なるファイルを同時に処理する5つの複数のスレッドを作成する必要があります。いずれかのスレッドが最初に完了すると、次のキューに入れられたファイルがそのスレッドに参加します。PHPを使用して複数のCSVファイルを同時に読み取る(マルチスレッド)Pthread

たとえば、私は1X.CSVを50X.CSVに持っています 5X.CSVを処理するために5つのスレッドを開始します。現在、3X.CSVは他の4つのファイルと比較して非常に小さいです。その処理が最初に完了します。 3番目のスレッドは空きになり、次のキューに入れられたファイル、つまり6X.CSVが検索されます。各スレッドは個別に動作します。

私の問題は、ファイルを読み取らずにマルチスレッドを行っているときに、うまくいきます!しかし、fopen()はrun()関数でファイルを読むのには役に立たない。私がどこに間違っているのか誰にでも教えてくれますか?以下は私のコードです。どんな助けも高く評価されます。

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

'$ this-> file'をエコーし​​ようとしました。スレッド内の' fopen'関数内で 'file'を取得していないようです。 –

+0

既に試しました。それはそこを超えています! –

答えて

1

スレッドを開始した直後にスレッドが終了するのを待ちます。その後、次の作業を開始します。ヒント:自分が行ったことを記録しただけであれば、自分で間違いを見つけたでしょう。

関連する問題