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

PHP&MySQL(キューやスタック)

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


↓↓イメージ
while( $row = mysql_fetch_array( $result, MYSQL_BOTH ) )
{
$syori->excute($row["data"]);
}


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

複数のプロセスを立ち上げずに、一気に処理する方法はあるのでしょうか?

よろしくおねがいします。

●質問者: webtomake
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● POGPI
●50ポイント ベストアンサー

Javaで、マルチスレッドを使うのは、どうですか。


webtomakeさんのコメント
PHPでお願いします。

webtomakeさんのコメント
http://qiita.com/rana_kualu/items/02f380f2f3d5020051bb のは使えそうですね

2 ● suinger
●50ポイント

一度、結果を連想配列に全て保管して、その後処理をかけるのはどうでしょうか。
exec()の内部処理でのループが1階層増える形です。
↓↓イメージ
$result_array = array();
while ($row = mysql_fetch_array( $result, MYSQL_BOTH )) {
$result_array[] = $row;
}
$shori->execute($result_array);


webtomakeさんのコメント
データ量の関係上、一気に処理ができません。 都度、行う必要があり、結果的にWhile内で処理を行っている背景があります。

suingerさんのコメント
データ量、背景につき承知しました。 PHPの配列処理にてwhile, for, foreachなどのループの代わりに使用して並列処理させる以下はいかがでしょうか。 ▼PHPでループを並列処理する http://qiita.com/hironobu_s/items/b72cb9d876e467c59697 https://github.com/hironobu-s/parallel-for ===== ParallelFor紹介 PHPの配列に対する操作を、並列で行うクラスです。PHPのwhile, for, foreachなどのループの代わりに使用することを目的としています。 配列の各要素に以下のような処理を行う場合に、処理時間を短く出来る可能性があります。 CPU時間のかかる処理を実行する場合 DBアクセス、ネットワークアクセスなどブロックされる処理がある場合 1の場合はマルチコアなCPUでないと効果がありません。 動作環境 PHP5.3以降 pcntl系の関数が使用できること(mod_phpなどでは動作しません) PHPをコンパイルするときに --enable-pcntl オプションをつけてください。また、yumやaptでインストールしたPHPでは、最初から使えることが多いようです。 仕組み 処理対象の配列をより小さな複数個の配列に分割して、それぞれをpcntl_forkで作成した子プロセスで処理し、結果をマージして返します。分割数は設定で変更できます。 配列の要素に対する処理内容と結果をマージする処理は、それぞれクロージャを作成して渡します。 詳しくはexampleディレクトリとtestディレクトリ内のファイルを見てください。 制約 実行する前にDB接続、ネットワーク接続、ファイルハンドルなどの全てのリソース型を閉じるようにしてください。これは親プロセスがリソースをオープンしたまま子プロセスを作成し、子プロセス側でこれらを閉じる(スクリプト終了で自動的に閉じられるものも含む)とPHPの挙動が不安定になるからです。プロセスがいきなり終了したりします。 特にフレームワーク内で使用する場合、フレームワークが自動的に開いたDB接続などに注意してください。 =====
関連質問

●質問をもっと探す●



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