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

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

ただいまの
回答率

90.54%

  • PHP

    23523questions

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

  • MySQL

    6813questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

自動で処理を走らせる方法

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 547

tarao

score 20

ユーザー同士でメッセージを送受信できるトークルームを作っています。

ユーザー間で商品を売り買いできるサイトなのですが、購入者側が購入後メッセージを送信しなかった場合、購入者に24時間後毎に催促メールの送信をするシステムです。

出品者側の方でも,7日間メッセージを送らなければ自動でトークルームがクローズし、クローズしたことを
知らせるメッセージを購入者に送信する処理をします。

そこで質問なのですが、どちらかがアクセスしてくれれば条件などで、メールの送信を送ったりなど出来ますが、どちらもこの期間にアクセスしなかった場合、18時間ごや7日後ちょうどにメールを送信することは不可能ですよね?

この場合、データベースのトークルームが開設された時間を自動で見て、指定の時間ごとにアクセスがなければメッセージの送信をするということは可能なのでしょうか?

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+5

OSにもよりますが、定期的にチェッカーを走らせて
条件が合致したものだけ処理をさせればよいのでは?
Linux系ならcron、Win系ならタスクスケジューラあたりが妥当です
環境的にapache+php+mysqlならphpでチェッカーページを用意して
wgetでそのページを読ませる方法なら、定期処理のトリガーは
サーバー自体が管理しなくてもすみます(もちろんサーバーが管理してもOK)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 16:37

    どうもありがとうございます!
    cronでどうやって条件を指定したらいいのかわからずにいたのですが、wgetを使えばいいのですね。
    再度質問なのですが、wgetを読み込ませるのはcronを使って何分置きに読み込むといったやり方で大丈夫なのでしょうか?
    定期処理のトリガーをサーバ自体が管理するというのはcronを使用することで良いのでしょうか?
    質問ばかりですみません。宜しくお願いします

    キャンセル

  • 2017/03/08 16:58

    あまり頻繁にやってもヒットしないでしょうし
    最短で5分おき、とりあえずは1時間おきくらいが妥当ではないでしょうかねぇ
    どうしても任意のタイミングで処理したいならそのページに手動で
    アクセスすればいいのですから

    キャンセル

  • 2017/03/08 18:18

    指定した時間にファイルを読み込んで、条件通りにメールを送信することができました!
    ありがとうございました!

    キャンセル

+2

可能です。

例えば安直なやり方ですが、
データベースのトークルームが開設された時間を取得、アクセスされた日時を取得して、指定時間アクセスがなければメールを飛ばすというPHPファイルを、
cronなどで定期実行するように設定してやれば自動でお望みの機能が実装できます。

ただし、データ件数やネットワーク量、アクセス量によっては上記のやり方だとサーバーの負担になることがあります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 18:20

    回答ありがとうございました!
    サーバーの負担になることもあるとのことで、そこらへんについて勉強していきたいと思います!

    キャンセル

+2

タスクスケジューラ相当のアプリケーションを作ってそちらで管理するという方法が良いですかね。
今回の場合、メッセージを送った時点で常に残日数を7日に戻さなければならないため、既存のタスクスケジューラを使うのは重い作業になってしまって難しいでしょう。

例えば期限で常にソートしたコンテナを管理しておき、その期限が最も低いものだけチェックし、期限が切れていれば各イベントに配送するといったものが妥当な設計でしょうか。

具体的に言えば、Redisのソート済みセット型を使うなどが良いでしょう。
期限をスコアとして登録しておき、その最もスコアの低いデータを一定時間ごとにピークします。
スコアの低いデータの値が現在時刻を割っていたら他のサービスに通知を送りましょう。
メッセージが送られるたびにこのスコア値を新しい期限で更新しておきます。

最低限以下のような3種のメソッドが全て実現されていれば実用に耐えるのではないでしょうか。

// トークルームのIDを渡して期限を更新する
UpdateRoomExpirely(roomId);

// 定期的に実行することで期限切れをチェックするメソッド
Check();

// 購入者と販売者の間でやり取りが完了した場合にルームをクローズする
CloseRoom(roomId);

これと同じように催促メールを管理するサービスも作りましょう。

// 購入者のIDを渡して24時間後に期限を設定する
SetReminder(buyerId);

// 定期的に実行することで期限切れをチェックするメソッド
Check();

// 購入者の催促メール設定を解除する
UnsetReminder(buyerId);

なお、24時間、とか7日間、という値を渡していないのは、サービス側の実装で処理すべきことだと思われるからです。

PHPでどこまでこういった処理ができるのか僕には分からないんですが、常駐アプリケーションを1つ作ってしまった方が簡単だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/03/08 18:25

    丁寧に教えていただいてありがとうございました!
    知識が足りてなくて常駐アプリケーションを作るということが、どういうことなのかから調べていきたいと思います。
    既存のタスクスケジューラを使うのは重い作業になるということがやはり心配ですね。

    キャンセル

同じタグがついた質問を見る

  • PHP

    23523questions

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

  • MySQL

    6813questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。