• 締切済み

スレッド?プロセス?複数鯖で分散処理をしたいのですが。

複数のサーバを使って処理を分散したいと考えています。 鯖Aにあるa.phpを動かす(指令:鯖Bにあるb.phpを動かせ) ↓ 鯖Bにあるb.phpが起動(指令:鯖Cにあるc.phpを動かせ) ↓ 鯖Cにあるc.phpが起動(鯖Dにあるd.phpを.....) ↓ ....(ry としていきたいのです。 しかし a.phpに file(http://example.com/b.php); と書いてみたのですが、これではb.phpの処理終了まで鯖Aのa.phpが待機することになってしまいます。 結局b.phpの処理終了というのはc.phpの処理終了=d.phpの処理終了・・・・・と言うことなので、a.phpは処理時間は変わらない(寧ろ他鯖との接続分長くなる)のです。 図 a.php(b.php、c.phpの終了まで待ってしまう) 始 | トb.php | 始 | | | トc.php | | 始 | | | | | 終 | 終 | 終 a.phpがb.phpに実行命令を出したら、a.phpは即終了できるように(待たないように)できないのでしょうか?(引数やらは帰ってこなくていいので。) こうしたい a.php 始(呼び出したphpの帰りを待たずに終了) | トb.php | 始 終 | 終 トc.php 終 | 始 終 終 | 終 終 トd.php 終 終 | 始 終 終 終 | 終 終 終 ト........ AAヘタですいません・・・・・ 「ト」っていうのは呼び出したってことです。

  • PHP
  • 回答数1
  • ありがとう数0

みんなの回答

回答No.1

・a.phpではb.phpにLocateさせるヘッダーをだして、 それを受け取ったブラウザに自動で次のb.phpにアクセスさせる (ブラウザを途中で強制終了されたりして、不安定か) ・a.phpで子プロセスをforkして、そこからb.phpを呼び出す。 (a.phpはすぐに終わってブラウザに応答が変えるが、サーバー上のプロセス数は増える) ・キューイングシステムを自前で作る  a.phpではb.php実行のキックを行う処理だけ行いb.phpの終了は待たない。  たとえば、a.phpからbサイトにメールを送信して、bサイトはそのメールをパイプで受け取ってb.phpを自動実行するとか、  a.phpはbサイトに処理内容を書いたファイルをftpとかで送って、b.phpはそのファイルをcronでポーリングしているとか。

関連するQ&A

  • 複数の処理の終了を待ちたい

    お世話になります。以下、教えていただけますでしょうか? バッチファイル(A.bat)を作成しています。 そのなかで、a,b,c,dの複数のプログラムを、前処理の終了を待たずに起動させ、a,b,c,d全てが終了するのを待って、eというプログラムを実行させたいのです。 --------------- start a start b start c start d --------------- この記述で、a,b,c,dが一度に起動することは確認できました。 しかし、この後の、「a,b,c,d全ての終了を待ってeを起動させる方法」というのが分かりません。 教えていただけますでしょうか? それとも、そもそも、バッチでは実現不可能なのでしょうか?

  • 複数列にあるデータのグラフの処理に困っています。

    以下のデータの処理で困っています A  B C D E : : : : : : : : : : : : : : : 10a 10b 10c 10d 10e というように一つの列にいくつもプロットされた数字があり、10a→B→10b→C...というようにして1本の曲線にしたいのですがうまくいきません。A列に全部コピーするという手もありますが今後も同様の処理をする羽目になるので何かいい手はないものか考えています。別の方も同じ質問をされていたのですがマクロを使うやり方であって、マクロを知らない私としてはそれ以外の手を捜しています。一つの系列に入れようとしてますが「=収集!$A$1:$A$10a+$B$1:$B$10b....」としてみましたがエラーばかりです。よろしくお願いします。

  • サブクエリを使わずにこんな処理はどうすれば(HELP!)

    DB初心者の私、サブクエリの使えないMySQL4.0+PHPでWebシステムを構築しようとしていますが、以下のようなことで困っています。 以下のような販売データのDBがあるとします(あくまで例です)。 ---------------- product shop ---------------- A    a B    a C    b A    c B    d D    c D    b C    a C    a C    a B    a ---------------- このproductを、shop='a'のレコードに絞込み、その他のshopを含めた販売数の多い順にソートして出力したいのです。 上表の例では、productのA,B,Cがshopのaで売れており、全体では、Cが4個,Bが3個,Aが2個売れているので、C,B,Aという順序に出力したいのです。 こんな処理がMySQLでサブクエリを使わず書けるでしょうか? 実際に扱うデータはもっと複雑で、productの種類もレコード数も多く、1ページ10 productずつなど、複数ページに亘って表示させたいです。 しかし、PHP側でソート処理を行う場合、セッションなどを用いて、ページ間でデータを引き継がなくてはなりません。 いろいろ調べると基本、ページ毎にクエリを投げるほうがよいということらしいので、できればPHPのページごとにクエリを投げて、MySQL側でソートまでしてもらい、PHPではその結果を受け取って表示するだけという形にしたいと思っているのですが。。。 素人なもので、行き詰っています。どなたかのお知恵を拝借したく、よろしくお願いします!

    • ベストアンサー
    • MySQL
  • include_onceで呼び出したPHPファイル

    PHPでサイトを組んでいるのですが、include_onceで以下のようにPHPの各ファイルを呼び出して実行しているのですがうまくいきません。 <?php //レンタルサーバーのcronを利用して、定期的に走らせるコードです。 include_once "example_a.php"; include_once "example_b.php"; include_once "example_c.php"; ?> 各ファイルは、RSSで読み込んだデータをMySQLに格納するプログラムです。 個別で各ファイルを実行すると正しい結果となりますが上記のようなプログラムでまとめて実行するとexample_a.phpは正しい結果となりますが、example_b.php、example_c.phpは正しく処理されません。 原因として考えられるものがあれば、教えていただきたいと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • WSHプログラミングで、Shell実行プロセスが終了しない内に、次の処理が実行されちゃいます・・・

    WSH(WindowsScriptingHost)でプログラミングを行っております。 以下のように、「A.exe」実行後、「B.exe」を実行するようにスクリプトを記述しています。 ところが、実際に実行してみると、「A.exe」が終了しない内に、「B.exe」が実行されてしまっている様なのです。 しかし、プログラム処理上、「A.exe」が実行終了してからでないと、「B.exe」を実行するのはまずいのです。 WSHで、「A.exe」が実行終了するまで、「B.exe」を実行させないようなスクリプトの記述方法を教えて下さい。 Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd.exe /c D:\A.exe" Shell.Run "cmd.exe /c D:\B.exe"

  • 同じサブクエリが複数出てくるのでまとめたい

    SELECT a.num b.num FROM   サブクエリA(いろんな処理 WHERE a_id=ANY(サブクエリC(いろんな処理)) ) AS a,   サブクエリB(いろいろ処理 WHERE b_id=ANY(サブクエリD(いろんな処理)) ) AS b このような処理をしているのですが、サブクエリCとサブクエリDは一字一句違わない全く同じ処理をしています。 2回全く同じ処理をするのは処理コストが無駄にかかりますし、同じ内容を示す表記が2度出てくるのは保守性も悪くします。 サブクエリCとDを共通化して一つにまとめる方法はありますでしょうか。

    • ベストアンサー
    • MySQL
  • スレッドAで信号を送り、返答があったときにスレッドBを起動、スレッドAの信号のデータを初期化する方法

    VC6.0で開発しています。 今、次のような処理をどうすればよいか悩んでいます。ヒントになる回答を頂けたら幸いです。 データをやり取りする際、どのような処理を行うか命令するもの(以下、命令A)と、命令された通りのデータを送るもの(以下、送信B)、そして、AとBの通信部分を担うもの(以下、通信C)があります。 データのやりとりは、マルチスレッドで行っています。 データをやりとりするために、スレッドが通信C上で2つ起動しています。1つ目のスレッド(以下、スレッドA)は、送信Bが命令Aから送られる特定のデータ(以下、データA)を受け取れるかをどうかの信号を、命令Aに送るためのものです。2つ目のスレッド(以下、スレッドB)は、データAを通信Cが受け取り、送信Bに渡すときに起動するスレッドです。 スレッドAで、送信Bから命令Aへ、受信の準備ができたことを伝える信号が送られます。その後、命令AよりデータAが送られ、通信CでスレッドBが起動するのですが、データAを通信Cで受信したとき、スレッドAで送っている信号を初期化しなければいけません。 データAを受信したときにはスレッドBが起動しますので、スレッドAとスレッドBの間での処理ということになります。 スレッド処理について、まだまだ不勉強なのですが、よいアイディアがあれば教えてください。 よろしくお願いします。

  • 【VBA】真の場合、何もしない処理をしたい

    VBAで困っています。 (1)A=BかつC=D (2)A≠BかつC=D (3)A=BかつC≠D (4)A≠BかつC≠D 以上4つの条件がある時、(1)以外では処理をしたいです。 For n = 1 To 10 If (1)   何もしない処理 end if (2)、(3)、(4)にしたい処理 Next 条件(1)では、何もせずに、Nextまで飛んで、次のnで処理をする方法は有りますか?

  • fork()で作られた子プロセスから親プロセスの生存を知る方法は?

    タイトルの通りなのですが、プロセスAから fork()で子プロセスBを作り、Bには無限ループで処理をさせます。 Aはユーザからの入力を受け、処理を行います。 Aが終了要求をされプロセスを終了するときに、 Bも同時に終了したいのですが、BからAの生存を判定して Aのプロセスが切れていたBも終了する、ということは可能でしょうか? Bの無限ループ処理では、ファイルの書き換えを行っているので AからBのPIDを指定してKillする、ということはせずに B自身で判定して終了するようにしたいのですが。。

  • Windowsのデュアルコアと負荷の分散について

    Windowsの問題です。 デュアルコアの一方のコアをコア1として、他方をコア2とします。 コア1でプログラムA,Bが動いていて、コア2でプログラムC,Dが動いていているとします。 プログラムC,Dが終了したときに、プログラムA,Bが動いているとします。 コア1のみビジーでコア2はアイドル状態になります。 このときプログラムBがコア1からコア2に移動して実行するのでしょうか。 それともコア1の上で動き続けるのでしょうか。コア1のみビジーでコア2はアイドル状態ままでいるのでしょうか。 もう1つの質問です。同じプログラムでも別のコアで動作するのでしょうか。 即ち、プログラムAをパラメタ1で起動し、プログラムAをパラメタ2で起動します。 パラメタ1で起動したプログラムAはコア1で、パラメタ2で起動したプログラムAは別のコアで実行するのでしょうか。 パラメタ1で起動したプログラムAとパラメタ2で起動したプログラムAは同じコアで実行するのでしょうか。 わかっている方がおりましたら、教えて下さい。

専門家に質問してみよう