質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

Q&A

2回答

2567閲覧

ユーザー数に応じてCRONで実行するPHPの実行時間や間隔の設計について

退会済みユーザー

退会済みユーザー

総合スコア0

cron

cronは、Unix系OS上でデーモンプロセスとして動作する、スクリプトの自動実行が可能なジョブスケジューラです。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

サーバ

サーバは、 クライアントサーバモデルにおいてクライアントからの要求に対し 何らかのサービスを提供するプログラムを指す言葉です。 また、サーバーソフトウェアを稼動させているコンピュータ機器そのもののことも、 サーバーと呼ぶ場合もあります。

0グッド

0クリップ

投稿2015/07/09 00:16

PHPで1回処理する時間が30秒だとします。1プロセス=30秒という感じです。
これを1分毎のCRONで実行した場合、1日だと60分×24時間=1440回実行できる計算になります。

次に、1プロセス=30秒なのでfor文で2回まわして60秒で2回実行するようにします。
これを1分毎のCRONで実行した場合、1日だと2回×60分×24時間=2880回実行できる計算になります。

しかしこれ以上実行したい場合、たとえば1日に1万回、2万回など。
ユーザーに人数が増えてきたらそのたびにCRONを追加するか?

このような問題がでてきています。

そもそもサーバーで一度に実行するプロセスが一つというのも勿体無い気がします(専用サーバーを借りています)。
実行に30秒かかるプロセスが、複数立ち上がっても問題ないと思いますが、CRONで3秒置きに実行するか、それともユーザーの人数が増えたら実行する間隔を短くするという別の方法を考えるか悩んでいます。

30秒の処理を実行する実態のPHPをexe.phpとし、このexe.phpを3秒置きに呼び出す別のphpを用意するとか…。

このあたりはどのようなアプローチで設計すればいいのでしょうか?
どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

内容が書かれてないので、あくまで一般論ですが、

このあたりはどのようなアプローチで設計すればいいのでしょうか?

ユーザーの人数が増えるに従ってcronから起動する回数を増やすというアプローチが間違ってると思います。
処理の内容、目的は何でしょうか?
一般論で言うと、1回の起動で全ユーザー分を処理するというのが普通だと思います。

PHPで1回処理する時間が30秒だとします。

どんな処理か分かりませんが、一般論で言うと長すぎですね。

投稿2015/07/09 01:18

otn

総合スコア84555

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/07/09 02:07

ご回答ありがとうございます。 情報が足りず申し訳ございません。 まず処理の内容ですが、私のサイトとは別のwebサービスからAPIで取得した情報を元に各ユーザーが持つデータを更新する、という処理になります。 各ユーザーは数万件のデータを私のサイトのデータベースに持っていて、そのデータをCRONで一定期間毎に更新してきます。 30秒ですべての更新は終わらず、数日かけて更新しますので、だいたい30秒で更新できるように更新頻度を区切っているのです。 そのため、全ユーザー(300人)が同時に更新する、というのは現実的なのかわからず、同時に更新する人数が10人ずつになるように、3秒置きに実行すればいいのではないか?と考えました。 どうぞよろしくお願い致します。
otn

2015/07/09 04:43

よく分からないのですが、300人分を数日掛けて処理すればいいと言うことですか? じゃあ、300人分の処理を数日毎に起動すればいいのでは? 今やっていること、やろうと思っていることはさておき、要件を書いてみてください。
退会済みユーザー

退会済みユーザー

2015/07/09 05:03

今はまだ何もやっていない状態です。 300人ユーザーがいて、1ユーザーのデータ更新が数日かかるので、一人ずつ順番に更新していくと、後のユーザーの更新が数日後に開始されますので、それだとユーザー毎に不公平がおこります。 そのため、300人のそれぞれのデータが満遍なく更新できるように、小分けにしながら更新をかけていくことにしたいと考えています。 1プロセスの更新フローとしては、 データベースから会員を一人選ぶ ↓ その会員が持つデータのうち更新すべきデータを30件取得する ↓ 30件のデータをAPIに投げる ↓ APIから新しいデータが届く ↓ そのデータをデータベースに更新する これが約20~30秒ほどかかります。 これを300人分、満遍なく常に更新し続けるロジックを考えています。 このような補足でよろしいでしょうか? どうぞよろしくお願い致します。
otn

2015/07/09 06:47

> 1プロセスの更新フローとしては、 これを300人分繰り返す処理を延々と続ければ良いだけではないでしょうか。 不公平無く実行するにはどのユーザーの分を次に実行するのかの選択ロジックで工夫する。 cronから30秒ごとに起動するなどと言うのは全く見当違いの話だと思いますよ。 同時に10プロセス行うなら、各プロセスで30人分ずつのループを回せば良いだけ。 30人は固定でも良いし、動的にロジックで入れ替わっても良いし。
退会済みユーザー

退会済みユーザー

2015/07/09 07:26

何度もアドバイス頂きましてありがとうございます。 >これを300人分繰り返す処理を延々と続ければ良いだけではないでしょうか。 PHPの1プロセスの実行時間って環境変数で設定できますが、制限時間を無制限にするという意味でしょうか?PHPってあまり長時間動作させるイメージがなかったのでCRONで30秒や1分置きに実行するものだと思っていました。 >cronから30秒ごとに起動するなどと言うのは全く見当違いの話だと思いますよ。 もしずっと実行しっぱなしで途中でエラーなどで停止した場合を考えて、「起動→停止」を繰り返したほうがいいのかなとかも思っていました。 いろいろ参考になります。ありがとうございます。
otn

2015/07/09 08:29

え?と思って念のためマニュアルを見ると > max_execution_time integer > (中略) PHP を コマンドライン から実行する場合のデフォルト設定は 0 です。 デフォルトで時間制限はありません。 > 途中でエラーなどで停止した場合を考えて エラー監視の仕組みは別途必要です。 単純再実行可能であれば、カジュアルには、1人30件30秒ならそのワンセットを300人分実行して終了するようにして、それを150分単位で起動すればいいでしょう。前回の処理が終わってなければ即終了(ロックファイルなどで排他制御)、もしくは一定時間待つ。 ただ、エラーが出た以上、単純再実行してもまたエラーになると思うので、なんらかの工夫は必要。
退会済みユーザー

退会済みユーザー

2015/07/09 11:51

ありがとうございます。 もう少し自分で調べてから質問させて頂きたいと思います。 アドバイスありがとうございました。
guest

0

用件に合うのか分かりませんが、各ユーザーがそのデータを触れる際に、更新が必要な場合それぞれ30秒待ってもらったらどうですか。タイミング待ちで更新されてないよりマシかと思いますが。

投稿2015/07/09 08:18

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問