2016-10-17 6 views
0

私は何千ものpremade sqlファイルからデータを抽出したいと思っています。私はPHPでMysqliドライバを使用する必要があるスクリプトを持っていますが、それは一度に1つのSQLファイルなので、実際には遅いです。私は、各SQLファイルがロードされる一意の一時データベース名を作成するようにスクリプトを修正しました。データはアーカイブデータベーステーブルに抽出され、tempデータベースはダンプされます。物事をスピードアップするため、以下のようなスクリプト構造の4つのスクリプト、を作成しました。それぞれのforループは独自のPHPファイルに格納されています(以下のコードは、4別のファイル)、彼らはソースファイルフォルダからのファイルの1/4をつかむように設定されています。このすべてが完璧に動作し、スクリプトが実行され、ファイル処理に干渉がゼロになります。問題は、私がパフォーマンスをほとんどゼロにするようだということです。たぶん10秒速い:(私はすぐにPHPmyadminのデータベース一覧ページを更新して、いつでもロードできる4種類のデータベースを見ることができましたが、DB名がオンザフライで変化しているため、私はmysqli/PHPで動作するようにすることはできますか?あるいは他のオプションを調べる必要はありますか?これをやりたいですか? (バージョン7.0)PHPでスクリプトを実行してテストしましたが、それは問題ですか?コマンドラインでそれらを実行し、それらをバックグラウンドに設定するコードは書かれていません。最後のメモ、私のmysqlデータベースのすべてのユーザーは、接続などに制限がありません。パラレルでPHPおよびMysqliクエリを実行する

$numbers = array('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20'); 


$numCount = count($numbers); 
$a = '0'; 
$b = '1'; 
$c = '2'; 
$d = '3'; 

$rebuild = array(); 

echo"<br>"; 

for($a; $a <= $numCount; $a+=4){ 

if(array_key_exists($a, $numbers)){ 
    echo $numbers[$a]."<br>"; 
} 

} 

echo "<br>"; 

for($b; $b <= $numCount; $b+=4){ 

if(array_key_exists($b, $numbers)){ 
    echo $numbers[$b]."<br>"; 
} 
} 

echo "<br>"; 

for($c; $c <= $numCount; $c+=4){ 

if(array_key_exists($c, $numbers)){ 
    echo $numbers[$c]."<br>"; 
} 

} 

echo "<br>"; 

for($d; $d <= $numCount; $d+=4){ 

if(array_key_exists($d, $numbers)){ 
    echo $numbers[$d]."<br>"; 
} 

} 
+0

まあ、あなたのコードは1つのループを実行していきますが、それらは並行して実行されません。言い換えると、2回目の 'for'ループは、前のすべてが終了するまで実行されません。スレッド化のためには、 'Thread'クラスをサブクラス化する必要があります。これを読んで:https://www.mullie.eu/parallel-processing-multi-tasking-php/ –

+0

私の悪い...それぞれのループのためにそれは自分のファイルです...私はちょうどアイデアの迅速な表示のために書式設定しました。 – photocode

+0

ああ、私はそれを得る。しかし、とにかく、並列処理では、複数のスレッドを使用する必要があります( –

答えて

2

試してみてください:

<?php 
    class BackgroundTask extends Thread { 
     public $output; 
     protected $input; 

     public function run() { 
      /* Processing here, use $output for... well... outputting data */ 

      // Here you would implement your for() loops, for example, using $this->input as their data 

      // Some dumb value to demonstrate 
      $output = "SOME DATA!"; 
     } 

     function __construct($input_data) { 
      $this->input = $input_data; 
     } 
    } 

    // Create instances with different input data 
    // Each "quarter" will be a quarter of your data, as you're trying to do right now 
    $job1 = new BackgroundTask($first_quarter); 
    $job1->start(); 

    $job2 = new BackgroundTask($second_quarter); 
    $job2->start(); 

    $job3 = new BackgroundTask($third_quarter); 
    $job3->start(); 

    $job4 = new BackgroundTask($fourth_quarter); 
    $job4->start(); 

    // ================== 

    // "join" the first job, i.e. "wait until it's finished" 
    $job1->join(); 
    echo "First output: " . $job1->output; 

    $job2->join(); 
    echo "Second output: " . $job2->output; 

    $job3->join(); 
    echo "Third output: " . $job3->output; 

    $job4->join(); 
    echo "Fourth output: " . $job4->output; 
?> 

HTTPを使用して独自のスクリプトを4回呼び出すと、接続が過負荷になって有用な理由がなくなってしまいます。代わりに、あなたはあなたのウェブサイトにアクセスしようとしているかもしれない他のユーザーのためにスペースを取っています。

+0

コードをありがとう!拡張されているスレッドクラスはどこにありますか? – photocode

+0

最初の行 'Thread Thread'を見てください。これには、スレッドで動作するすべてのコードが含まれます。 –

+0

私はこれをPHPマニュアルで見ただけで、pthreads拡張モジュールに組み込まれていることを認識しませんでした。私の元のコンセプトは4種類のスクリプトでOKですか、それとも私のオリジナルを使ってすべてのファイルを繰り返して何度も複製することができますか?私のオリジナルのデザインは、ファイル処理の問題を防ぐことでした。なぜなら、SQLファイルが終了したときにSQLファイルも削除されたからです。 – photocode

関連する問題