PHPからLAN上にある複数のDBサーバへ、それぞれ1秒ほどかかるクエリを投げています。

こちらをcurl_multi()関数のように並列実行する方法はありますでしょうか?

順番に2つ実行:2秒は少なくとも掛かる
同時に2つ実行:1秒ほどで終わる

もし並列実行できればクエリ実行時間が1秒で済むのでどうにか出来ない物か、質問させて頂きました。
なるべくシンプルに出来る事が理想です。

環境:専用サーバ CentOS 5.3 x64 / PHP 5.2.9 / MySQL 5.0.51a

回答の条件
  • 1人3回まで
  • 登録:2009/07/17 01:33:44
  • 終了:2009/07/24 01:35:02

ベストアンサー

id:sphire No.2

sphire回答回数115ベストアンサー獲得回数122009/07/17 10:13:36

ポイント27pt

1. それぞれのDBに接続して結果をserialize()して返すAPIスクリプトを作成

http://www.exapmle.com/get_table1.php
<?php

$db = MDB2::connect($dsn); //PEAR::MDB2使用をイメージ
$sql = "SELECT * FROM table1"; //適当
$result = $db->queryAll($sql);

header('Content-Type: text/plain; charset=utf8');
echo serialize($result);
http://www.exapmle.com/get_table2.php
<?php

$db = MDB2::connect($dsn); //PEAR::MDB2使用をイメージ
$sql = "SELECT * FROM table2"; //適当
$result = $db->queryAll($sql);

header('Content-Type: text/plain; charset=utf8');
echo serialize($result);

2. 上記2つを curl_multi_*() で並列に取得、、して unserialize()して使う。

id:ko-takada

ありがとうございます!

2009/07/22 10:22:06

その他の回答(2件)

id:pahoo No.1

pahoo回答回数5960ベストアンサー獲得回数6332009/07/17 07:35:57

ポイント27pt

PHPをCGI版で実行しているなら、シェルに & 指定することで並列処理ができます。

具体的な手順は「PHPで並列プログラミング」を参考にしてください。


Webサーバと連携して実行している場合は、ご質問にある関数 curl_multi を使い、クエリを書いた別の PHP スクリプトを呼び出す形になります。

具体的な手順は「PHPでマルチスレッド(バックグラウンド処理)を実現する方法」を参考にしてください。

id:ko-takada

現在PHPをmodule版で実行しているため、その方法を使えません…。

仮にCGI版だったとして、返り値が必要な場合にもシェルに&指定することで並列に取得出来るのでしょうか?

やはりcurl_multi()となりますか。。http以外でもし出来る方法がありましたらご教示頂けると幸いです。

2009/07/22 10:21:41
id:sphire No.2

sphire回答回数115ベストアンサー獲得回数122009/07/17 10:13:36ここでベストアンサー

ポイント27pt

1. それぞれのDBに接続して結果をserialize()して返すAPIスクリプトを作成

http://www.exapmle.com/get_table1.php
<?php

$db = MDB2::connect($dsn); //PEAR::MDB2使用をイメージ
$sql = "SELECT * FROM table1"; //適当
$result = $db->queryAll($sql);

header('Content-Type: text/plain; charset=utf8');
echo serialize($result);
http://www.exapmle.com/get_table2.php
<?php

$db = MDB2::connect($dsn); //PEAR::MDB2使用をイメージ
$sql = "SELECT * FROM table2"; //適当
$result = $db->queryAll($sql);

header('Content-Type: text/plain; charset=utf8');
echo serialize($result);

2. 上記2つを curl_multi_*() で並列に取得、、して unserialize()して使う。

id:ko-takada

ありがとうございます!

2009/07/22 10:22:06
id:b-wind No.3

b-wind回答回数3344ベストアンサー獲得回数4402009/07/17 10:32:36

ポイント26pt

PHP: pcntl_fork - Manual

古典的な方法としては fork だろうな。

PHPでの並列処理(fork) - asdf


どっちかって言うと今時のWeb系サーバーでクエリに1秒もかかってる方が問題化と。

内容にもよるが正直かなり遅い。

チューニングを検討した方がいいんでは?

id:ko-takada

コンパイルオプションでpcntl_forkを使えるようにしてインストールしてあるので、試してみたいと思います。ありがとうございます。

なおこのクエリは特殊な用途なので、どうしても重たくなってしまう物です。。

2009/07/22 10:24:02
  • id:b-wind
    >なおこのクエリは特殊な用途なので、どうしても重たくなってしまう物です。。
    特殊な用途かどうかは関係ないだろ…という突っ込みはおいといて。
    はっきり言うとそれでもチューニングの余地はある。と言い切れるぐらいDBチューニングは奥が深いとだけ言っておこう。
  • id:ko-takada
    実際は1秒もかからないのですが、質問文を分かりやすくするためにそうしました。分かりにくくてすみません。

    現在複数のDBサーバにクエリを投げている為、それぞれ0.3秒ずつかかる場合、3つ実行するとおよそ1秒となります。
    そこで並列処理すればトータル0.3秒で終わらせられます。これが実現出来る方法はないかとお伺いした次第です。
  • id:b-wind
    >実際は1秒もかからないのですが、質問文を分かりやすくするためにそうしました。分かりにくくてすみません。
    >現在複数のDBサーバにクエリを投げている為、それぞれ0.3秒ずつかかる場合、3つ実行するとおよそ1秒となります。
    1秒でも 0.3 秒でも大差ない。十分に遅い。

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

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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