自動で処理を走らせる方法
解決済
回答 3
投稿
- 評価
- クリップ 0
- VIEW 1,303
ユーザー同士でメッセージを送受信できるトークルームを作っています。
ユーザー間で商品を売り買いできるサイトなのですが、購入者側が購入後メッセージを送信しなかった場合、購入者に24時間後毎に催促メールの送信をするシステムです。
出品者側の方でも,7日間メッセージを送らなければ自動でトークルームがクローズし、クローズしたことを
知らせるメッセージを購入者に送信する処理をします。
そこで質問なのですが、どちらかがアクセスしてくれれば条件などで、メールの送信を送ったりなど出来ますが、どちらもこの期間にアクセスしなかった場合、18時間ごや7日後ちょうどにメールを送信することは不可能ですよね?
この場合、データベースのトークルームが開設された時間を自動で見て、指定の時間ごとにアクセスがなければメッセージの送信をするということは可能なのでしょうか?
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+5
OSにもよりますが、定期的にチェッカーを走らせて
条件が合致したものだけ処理をさせればよいのでは?
Linux系ならcron、Win系ならタスクスケジューラあたりが妥当です
環境的にapache+php+mysqlならphpでチェッカーページを用意して
wgetでそのページを読ませる方法なら、定期処理のトリガーは
サーバー自体が管理しなくてもすみます(もちろんサーバーが管理してもOK)
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
可能です。
例えば安直なやり方ですが、
データベースのトークルームが開設された時間を取得、アクセスされた日時を取得して、指定時間アクセスがなければメールを飛ばすというPHPファイルを、
cronなどで定期実行するように設定してやれば自動でお望みの機能が実装できます。
ただし、データ件数やネットワーク量、アクセス量によっては上記のやり方だとサーバーの負担になることがあります。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+2
タスクスケジューラ相当のアプリケーションを作ってそちらで管理するという方法が良いですかね。
今回の場合、メッセージを送った時点で常に残日数を7日に戻さなければならないため、既存のタスクスケジューラを使うのは重い作業になってしまって難しいでしょう。
例えば期限で常にソートしたコンテナを管理しておき、その期限が最も低いものだけチェックし、期限が切れていれば各イベントに配送するといったものが妥当な設計でしょうか。
具体的に言えば、Redisのソート済みセット型を使うなどが良いでしょう。
期限をスコアとして登録しておき、その最もスコアの低いデータを一定時間ごとにピークします。
スコアの低いデータの値が現在時刻を割っていたら他のサービスに通知を送りましょう。
メッセージが送られるたびにこのスコア値を新しい期限で更新しておきます。
最低限以下のような3種のメソッドが全て実現されていれば実用に耐えるのではないでしょうか。
// トークルームのIDを渡して期限を更新する
UpdateRoomExpirely(roomId);
// 定期的に実行することで期限切れをチェックするメソッド
Check();
// 購入者と販売者の間でやり取りが完了した場合にルームをクローズする
CloseRoom(roomId);
これと同じように催促メールを管理するサービスも作りましょう。
// 購入者のIDを渡して24時間後に期限を設定する
SetReminder(buyerId);
// 定期的に実行することで期限切れをチェックするメソッド
Check();
// 購入者の催促メール設定を解除する
UnsetReminder(buyerId);
なお、24時間、とか7日間、という値を渡していないのは、サービス側の実装で処理すべきことだと思われるからです。
PHPでどこまでこういった処理ができるのか僕には分からないんですが、常駐アプリケーションを1つ作ってしまった方が簡単だと思います。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/03/08 16:37
cronでどうやって条件を指定したらいいのかわからずにいたのですが、wgetを使えばいいのですね。
再度質問なのですが、wgetを読み込ませるのはcronを使って何分置きに読み込むといったやり方で大丈夫なのでしょうか?
定期処理のトリガーをサーバ自体が管理するというのはcronを使用することで良いのでしょうか?
質問ばかりですみません。宜しくお願いします
2017/03/08 16:58
最短で5分おき、とりあえずは1時間おきくらいが妥当ではないでしょうかねぇ
どうしても任意のタイミングで処理したいならそのページに手動で
アクセスすればいいのですから
2017/03/08 18:18
ありがとうございました!