
PHPで作ったWebサービスがあります。
ユーザーが100人いたとします。
この100ユーザーそれぞれのデータを、毎日0時(例えば)になると処理をするというCronを作りたいです。
PHPファイルは1ユーザー分の処理をするので、Cronで毎日0時に指定すると1人分の処理しかできません。
ではユーザー毎にCronを100個作るのは得策ではないと思います。
「一つのCron実行で100人分処理すれば?」というご意見もあるかもしれませんが、
1人分の処理が3~30秒かかるので、レンタルサーバーの1実行当たりの動作時間を超えてしまう問題があります。
毎日0時に100人分の処理を実行するのは無理なのでしょうか?
そもそも共用のレンタルサーバーレベルでは、100人分の同時処理というのは現実的ではないでしょうか?
そうすると、1人ずつ処理していくと、30秒×100人=50分の処理時間が必要になります。
こういう場合はどのように設計すれば良いのでしょうか?
どうぞよろしくお願い致します。
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や出力結果は工夫して)
サーバーの負荷が耐えられると判断できるなら
それぞれをバックグラウンドで並行処理してもいいでしょう
ありがとうございます!
wgetというのは初めて知りました。
あと説明不足ですみません。
データベース(MySQL)にユーザーIDがあり、各ユーザーに対して毎日0時くらいに同時に更新を掛けたいと思っています。
サーバーの負荷を考えながら並列化の検討ということですね。
No.4
- 回答日時:
#3です
ボトルネックになっているのがMySQLにあるのでしたら
効率的なSQL文でチューニングすることで高速化できるかもしれません
また更新を並行処理すると、トランザクションの問題が発生するかもしれません
普通にInnoDBで単純な更新をかけるだけならレコード単位でのロックなので
大丈夫かなぁ・・・
はい、InnoDBです。
そういえば並列処理だとトランザクションの問題が出ますね・・・。
なるべく並列にならないようなコードにするように設定してみます。
ありがとうございました!
No.2
- 回答日時:
根本的に見直すのがいいかと。
・アルゴリズムを効率のよいものにする
・データベースを使っているものなら、ストアードプロシージャをDBサーバーで非同期に実行させる等、PHP側での処理を削減させる
・実行タイミングを変える。
その日最初のアクセス時にそのユーザーだけの処理をする
最終アクセス/ログアウト時に「次の日用」の処理をして結果を別の保存しておき、0時になったら入れ替える
・C言語等の処理の早いものに書き換える
ありがとうございます!
>・アルゴリズムを効率のよいものにする
はい、検証しながらなるべく処理が効率良くなるように作っていく予定です。
>・データベースを使っているものなら、ストアードプロシージャをDBサーバーで非同期に実行させる
Cronでストアド・プロシージャを呼び出す感じですかね。
>・実行タイミングを変える。
やはり実行タイミングは調整しないといけないですか・・・。
ユーザーがアクセスしなかったりログインしなくても、ユーザーに代わって毎日0時くらいに自動的に更新作業をサーバー側でやりたいと考えています。
>・C言語等の処理の早いものに書き換える
私はC言語は使えますが、レンタルサーバーでC言語が使えるところってほとんどないですよね・・・。
今はエックスサーバーを使っています。
No.1
- 回答日時:
cronから1つのシェルスクリプトを実行する。
シェルスクリプトでは、ループで100回PHPのプログラムを実行する。
これでPHPのプログラムを100個起動できる。
ありがとうございます!
シェルスクリプトのループで100回PHPを起動すればいいのですね。
しかしいくつか懸念点があります。
・ユーザーが増えたり減ったりする度にシェルスクリプトを書き換えないといけない(データベースを参照してユーザーの増減に、わざわざ手動で対応しないといけない)
・100回起動すると共用レンタルサーバーでは処理的に問題ないでしょうか?
どうぞよろしくお願い致します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
データベースのレコードを入れ...
-
phpのheader("Location:#pos")...
-
.htaccessにphp_valueが使用できな
-
*.php、*.php3、*.phtmlの違い
-
mysql→EUC-JP、php→UTF-8の時の...
-
phpでメール送信できません 原...
-
phpのextension_dirを複数指定...
-
phpの中でphpを書けないか
-
PHP PDOライブラリが読み込まれ...
-
mamp環境でのcronの使い方で困...
-
PHPでメールを受信するには?
-
再度、xamppにおけるjpgraphの...
-
セッションについての設定なの...
-
2つの画像ファイルが異なるファ...
-
require_once()でファイルが読...
-
PHP版のPDFlibのインストール
-
header(Location:~)で$_SESS...
-
PHPからMSSQLへの接続結果の文...
-
includeでHTMLファイルを呼出し...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
リロードの防止法
-
RSSパースに使用する関数・ライ...
-
3の倍数の和
-
Cronで同じ処理を複数同時に実...
-
データベースのレコードを入れ...
-
アクセスクライアントごとにタ...
-
Smartyにて、文字検索
-
phpの処理中に画面表示ををする...
-
プログラム内で処理中断後も継...
-
インスタンス化に伴うメモリ消...
-
条件演算子
-
GETリクエストでURLを渡す時
-
コンストラクタについて
-
csvファイルの読込みとソート
-
includeしたファイルに変数を持...
-
PHPが処理を途中でやめる。原因...
-
PHPで文字列(日本語)の比較
-
PHP postgres でロールバック...
-
入れ子になっているHTMLタグも...
おすすめ情報