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

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

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

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

PHP

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

Q&A

解決済

3回答

1939閲覧

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

tarao

総合スコア28

MySQL

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

PHP

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

0グッド

0クリップ

投稿2017/03/08 05:36

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

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

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

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

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

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

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

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

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

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

guest

回答3

0

ベストアンサー

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

投稿2017/03/08 05:41

yambejp

総合スコア114839

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

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

tarao

2017/03/08 07:37

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

2017/03/08 07:58

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

2017/03/08 09:18

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

0

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

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

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

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

// トークルームのIDを渡して期限を更新する UpdateRoomExpirely(roomId); // 定期的に実行することで期限切れをチェックするメソッド Check(); // 購入者と販売者の間でやり取りが完了した場合にルームをクローズする CloseRoom(roomId);

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

// 購入者のIDを渡して24時間後に期限を設定する SetReminder(buyerId); // 定期的に実行することで期限切れをチェックするメソッド Check(); // 購入者の催促メール設定を解除する UnsetReminder(buyerId);

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

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

投稿2017/03/08 06:07

haru666

総合スコア1591

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

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

tarao

2017/03/08 09:25

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

0

可能です。

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

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

投稿2017/03/08 05:44

s.t.

総合スコア2021

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

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

tarao

2017/03/08 09:20

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問