PHP pthreads と MySQL



MySQLからデータを取得し、while内でループしながら処理をしています。


↓↓イメージ
while( $row = mysql_fetch_array( $result, MYSQL_BOTH ) )
{
  $data = $syori->excute($row["data"]);
mysql_query("insert into hoge ".$data);
}
//1処理とデータinsertに1秒かかる。
//100回の処理では100秒かかる。


この方法ですと、ひとつひとつ順番待ちの様に処理を行う為、処理が完了するまでに時間がかかってしまいます。

マルチスレッドを用いて一度に複数の処理を走らせたいのですが、どの様に記述すればよいのでしょうか?

詳細:
http://qiita.com/rana_kualu/items/02f380f2f3d5020051bb

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2015/05/14 21:40:14
  • 終了:2015/05/21 21:45:05

回答(3件)

id:e_p_i No.1

e_p_i回答回数101ベストアンサー獲得回数112015/05/14 22:07:16

ポイント34pt

insertは一括で行えませんか?
一回一回行っていると通信やトランザクション負荷が大きいと思われます。
まぁ例外処理にもよりますが…。

id:e_p_i

ではinsertをループ外に出して一括コミットをする事をおすすめします。
システム全体でDBをどういう形で使っているか分からないので、それがシステムに適しているかどうかは分かりませんけれども…。

2015/05/14 22:22:24
id:tea_cup No.2

tea_cup回答回数1023ベストアンサー獲得回数1832015/05/14 22:31:33

ポイント33pt

マルチスレッドとか難しいこと考えずに、SQL呼び出すのに時間がかかるのだから、DBから、テーブルまるごと取り出せば良いのでは。

http://d.web5.jp/sql/ の mysql_fetch より抜粋。

//db接続
$con = mysql_connect($DBSERVER, $DBUSER, $DBPASSWORD);
//データベースを選択
$selectdb = mysql_select_db($dbname, $con);
//指定テーブルから全レコードを読み込むSQL文
$sql = "select * from $tblname where id like \"4\"";
//データセット取得
$rst = mysql_query($sql, $con);
id:pogpi No.3

POGPI回答回数378ベストアンサー獲得回数502015/05/15 08:36:40

ポイント33pt

http://php.net/manual/ja/class.pool.php

$p->submitに、$row["data"]を渡して、runで処理と格納をやればできそうですね。

  • id:y-kawaz
    >//1処理とデータinsertに1秒かかる。

    おそらく実際にはDBは実質的に関係なく、$syori->excute のみでほぼ1秒掛かってるんですよね?
    なんてふうに、何かの処理syori->executeとDB処理を一緒に書いてるからズレた回答が返ってきてるように見えます。

この質問への反応(ブックマークコメント)

トラックバック

  • 人力検索 今月の回答 バッテリー(電池)が「上がる」とはどんな状態なのでしょうか?「切れる(残量がなくなる)」とは違うのでしょうか? 液面が下がるのにバッテリー上がりとはこれ如
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません