人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHPからLAN上にある複数のDBサーバへ、それぞれ1秒ほどかかるクエリを投げています。
こちらをcurl_multi()関数のように並列実行する方法はありますでしょうか?

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

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

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


●質問者: ko-takada
●カテゴリ:インターネット ウェブ制作
✍キーワード:CentOS DB LAN MySQL PHP
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● pahoo
●27ポイント

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

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


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

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

◎質問者からの返答

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

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

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


2 ● sphire
●27ポイント ベストアンサー

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()して使う。

◎質問者からの返答

ありがとうございます!


3 ● b-wind
●26ポイント

PHP: pcntl_fork - Manual

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

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


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

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

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

◎質問者からの返答

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ