アプリ版:「スタンプのみでお礼する」機能のリリースについて

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分の処理時間が必要になります。


こういう場合はどのように設計すれば良いのでしょうか?
どうぞよろしくお願い致します。

A 回答 (4件)

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や出力結果は工夫して)
サーバーの負荷が耐えられると判断できるなら
それぞれをバックグラウンドで並行処理してもいいでしょう
    • good
    • 0
この回答へのお礼

ありがとうございます!

wgetというのは初めて知りました。
あと説明不足ですみません。
データベース(MySQL)にユーザーIDがあり、各ユーザーに対して毎日0時くらいに同時に更新を掛けたいと思っています。

サーバーの負荷を考えながら並列化の検討ということですね。

お礼日時:2014/07/11 11:24

#3です



ボトルネックになっているのがMySQLにあるのでしたら
効率的なSQL文でチューニングすることで高速化できるかもしれません

また更新を並行処理すると、トランザクションの問題が発生するかもしれません
普通にInnoDBで単純な更新をかけるだけならレコード単位でのロックなので
大丈夫かなぁ・・・
    • good
    • 0
この回答へのお礼

はい、InnoDBです。
そういえば並列処理だとトランザクションの問題が出ますね・・・。

なるべく並列にならないようなコードにするように設定してみます。
ありがとうございました!

お礼日時:2014/07/18 01:26

根本的に見直すのがいいかと。



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

ありがとうございます!

>・アルゴリズムを効率のよいものにする

はい、検証しながらなるべく処理が効率良くなるように作っていく予定です。

>・データベースを使っているものなら、ストアードプロシージャをDBサーバーで非同期に実行させる

Cronでストアド・プロシージャを呼び出す感じですかね。

>・実行タイミングを変える。

やはり実行タイミングは調整しないといけないですか・・・。
ユーザーがアクセスしなかったりログインしなくても、ユーザーに代わって毎日0時くらいに自動的に更新作業をサーバー側でやりたいと考えています。

>・C言語等の処理の早いものに書き換える

私はC言語は使えますが、レンタルサーバーでC言語が使えるところってほとんどないですよね・・・。
今はエックスサーバーを使っています。

お礼日時:2014/07/11 11:20

cronから1つのシェルスクリプトを実行する。


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

この回答への補足

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

補足日時:2014/07/11 11:14
    • good
    • 0
この回答へのお礼

ありがとうございます!

シェルスクリプトのループで100回PHPを起動すればいいのですね。

しかしいくつか懸念点があります。

・ユーザーが増えたり減ったりする度にシェルスクリプトを書き換えないといけない(データベースを参照してユーザーの増減に、わざわざ手動で対応しないといけない)

・100回起動すると共用レンタルサーバーでは処理的に問題ないでしょうか?

どうぞよろしくお願い致します。

お礼日時:2014/07/11 11:01

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!