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


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


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


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

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

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

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2015/05/14 16:44:42
  • 終了:2015/05/14 21:11:35

ベストアンサー

id:pogpi No.1

pogpi回答回数369ベストアンサー獲得回数492015/05/14 16:49:07

ポイント50pt

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

id:webtomake

PHPでお願いします。

2015/05/14 18:06:28
id:webtomake

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

のは使えそうですね

2015/05/14 18:08:23

その他の回答(1件)

id:pogpi No.1

pogpi回答回数369ベストアンサー獲得回数492015/05/14 16:49:07ここでベストアンサー

ポイント50pt

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

id:webtomake

PHPでお願いします。

2015/05/14 18:06:28
id:webtomake

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

のは使えそうですね

2015/05/14 18:08:23
id:fatena No.2

suinger回答回数126ベストアンサー獲得回数262015/05/14 17:27:26

ポイント50pt

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

id:webtomake

データ量の関係上、一気に処理ができません。

都度、行う必要があり、結果的にWhile内で処理を行っている背景があります。

2015/05/14 18:07:13
id:fatena

データ量、背景につき承知しました。

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接続などに注意してください。
=====

2015/05/14 18:34:23

コメントはまだありません

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

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

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

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