• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Cronで同じ処理を複数同時に実行するには?)

Cronで同じ処理を複数同時に実行する方法は?

このQ&Aのポイント
  • PHPで作られたWebサービスで、ユーザーごとに毎日0時に処理を実行するCronを作りたい。
  • 1人ずつ処理すると50分の処理時間がかかってしまうため、一度に100人分の処理を行うのは難しい。
  • しかし、共用のレンタルサーバーレベルでは100人分の同時処理は現実的ではないため、設計を見直す必要がある。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

100人分やるということは同じプログラムを単に呼び出すだけではできませんよね おそらくユーザーIDを利用して更新したりするのでしょう wgetあたりでidを指定して更新プログラムをよぶならこんな形式になるでしょう #wget ページ/modify.php?uid=xxx なので、cronで複数のwgetを順に呼び出してやるのが妥当です。 他の方の指摘もあるようにそれをまとめて auto_wget.shにまとめて #!/bin/sh wget ページ/modify.php?uid=xxx wget ページ/modify.php?uid=yyy wget ページ/modify.php?uid=zzz という羅列したデータで処理してもいいですし(pathや出力結果は工夫して) サーバーの負荷が耐えられると判断できるなら それぞれをバックグラウンドで並行処理してもいいでしょう

suffre
質問者

お礼

ありがとうございます! wgetというのは初めて知りました。 あと説明不足ですみません。 データベース(MySQL)にユーザーIDがあり、各ユーザーに対して毎日0時くらいに同時に更新を掛けたいと思っています。 サーバーの負荷を考えながら並列化の検討ということですね。

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

#3です ボトルネックになっているのがMySQLにあるのでしたら 効率的なSQL文でチューニングすることで高速化できるかもしれません また更新を並行処理すると、トランザクションの問題が発生するかもしれません 普通にInnoDBで単純な更新をかけるだけならレコード単位でのロックなので 大丈夫かなぁ・・・

suffre
質問者

お礼

はい、InnoDBです。 そういえば並列処理だとトランザクションの問題が出ますね・・・。 なるべく並列にならないようなコードにするように設定してみます。 ありがとうございました!

すると、全ての回答が全文表示されます。
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

根本的に見直すのがいいかと。 ・アルゴリズムを効率のよいものにする ・データベースを使っているものなら、ストアードプロシージャをDBサーバーで非同期に実行させる等、PHP側での処理を削減させる ・実行タイミングを変える。  その日最初のアクセス時にそのユーザーだけの処理をする  最終アクセス/ログアウト時に「次の日用」の処理をして結果を別の保存しておき、0時になったら入れ替える ・C言語等の処理の早いものに書き換える

suffre
質問者

お礼

ありがとうございます! >・アルゴリズムを効率のよいものにする はい、検証しながらなるべく処理が効率良くなるように作っていく予定です。 >・データベースを使っているものなら、ストアードプロシージャをDBサーバーで非同期に実行させる Cronでストアド・プロシージャを呼び出す感じですかね。 >・実行タイミングを変える。 やはり実行タイミングは調整しないといけないですか・・・。 ユーザーがアクセスしなかったりログインしなくても、ユーザーに代わって毎日0時くらいに自動的に更新作業をサーバー側でやりたいと考えています。 >・C言語等の処理の早いものに書き換える 私はC言語は使えますが、レンタルサーバーでC言語が使えるところってほとんどないですよね・・・。 今はエックスサーバーを使っています。

すると、全ての回答が全文表示されます。
  • t_ohta
  • ベストアンサー率38% (5320/13881)
回答No.1

cronから1つのシェルスクリプトを実行する。 シェルスクリプトでは、ループで100回PHPのプログラムを実行する。 これでPHPのプログラムを100個起動できる。

suffre
質問者

お礼

ありがとうございます! シェルスクリプトのループで100回PHPを起動すればいいのですね。 しかしいくつか懸念点があります。 ・ユーザーが増えたり減ったりする度にシェルスクリプトを書き換えないといけない(データベースを参照してユーザーの増減に、わざわざ手動で対応しないといけない) ・100回起動すると共用レンタルサーバーでは処理的に問題ないでしょうか? どうぞよろしくお願い致します。

suffre
質問者

補足

すみません、調べたらシェルスクリプトでもデータベースにアクセスできるのですね。

すると、全ての回答が全文表示されます。

関連するQ&A