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で質問しましょう!
似たような質問が見つかりました
- その他(開発・運用・管理) bashで15分前と現在のエポックタイムの時間を取得したい 2 2023/02/01 19:10
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Excel(エクセル) エクセルVBA マクロ処理中のポップアップメッセージについて 1 2023/08/04 21:34
- 事故 現在、物損事故として処理されていますが、数日して痛みが出ました。 ただ、人身事故に切り替えるために警 4 2023/07/19 18:46
- その他(データベース) 業務用のデータベースサーバーの選び方について 4 2022/11/22 10:22
- UNIX・Linux cronでシェルスクリプト実行時のkubactlコマンドが機能しない対処法。 2 2022/08/03 18:58
- その他(プログラミング・Web制作) 単純なコマンドプロンプトが動きません。 2 2022/04/19 15:21
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- CPU・メモリ・マザーボード PコアとEコアの使い分け 3 2023/07/30 22:09
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
Cronで同じ処理を複数同時に実...
-
phpの処理中に画面表示ををする...
-
PHPで偶数と奇数を判断するには
-
関数の前にアットマークが付く場合
-
アクセスクライアントごとにタ...
-
onedrive にexcelファイルをア...
-
.phpと.incファイルの違いはな...
-
トランザクションが原因?DBに...
-
フォントの色を変えるには?
-
現在位置より2つ上のディレク...
-
CFileDialogの最初のディレクト...
-
VBSの「MsgBox」について
-
HPを開くとダウンロードページ...
-
3つ以上の論理積は利用可能なの...
-
php文字列中のシングルクオート...
-
MySQLでのdeadlockをPHPで検出...
-
.phpファイルが、表示されない
-
FTPコマンドでディレクトリごと...
-
C# メール送信ついて困っています
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
PHPが処理を途中でやめる。原因...
-
phpの処理中に画面表示ををする...
-
関数の前にアットマークが付く場合
-
PHPで偶数と奇数を判断するには
-
symfonyのCriteriaで実行すると...
-
System関数で変数を受け渡す方法
-
条件演算子
-
入れ子になっているHTMLタグも...
-
文字列の10+10を20と表示したい
-
インスタンス化に伴うメモリ消...
-
PHPExcel処理速度が遅い
-
ページの一部だけリロード
-
携帯サイトの構築について
-
JSPでevalを使いたい
-
PHP内、ボタン押下と同時にリロ...
-
◆バックエンド処理の終了を知り...
-
csvファイルの読込みとソート
-
Cronで同じ処理を複数同時に実...
-
mysql データベース処理が途中...
おすすめ情報