スケジュールされた投稿(php、mongo、cron、regexp)

こんにちは

最近、ソーシャルネットワークの壁に投稿を送信するためのページを作成する必要がありました。 タスクは、すぐにではなく特定の時間に壁に投稿することでした。

ソーシャルネットワークを選択するためのフィールド、メッセージテキスト、送信時間を入力するためのフィールドを含むページを作成しました。 送信の日付と時刻を選択する通常のカレンダーに加えて、cronルールに従って送信条件を入力する別のフィールドを追加しました。

テンプレート* * * * *

その後、質問が発生しました-送信に必要なフィールドのみを取得する方法は?

Cronは毎分トリガーされ、スクリプトを呼び出して投稿を送信します。毎分送信するために準備された投稿のテーブル全体を反復処理し、現在の日付/時刻と比較することは不要な操作です。

正規表現ですべてのフィールドを選択できるMongoDBデータベースを使用します。 ここに私がやったことがあります:

現在の日付と時刻を取得して配列に変換します

$dateTime = explode(' ', date('i G jn w', time()));

次に、現在の瞬間(現在の分)に送信するのに適したレコードを選択する正規表現を作成します。

$joe_search = new \MongoRegex(
'/^(\*|((\d{1,2}\,)|(\*\/))*('.($dateTime[0]*1).'){1}(\,\d{1,2})*)\s'.
'(\*|((\d{1,2}\,)|(\*\/))*('.($dateTime[1]).'){1}(\,\d{1,2})*)\s'.
'(\*|((\d{1,2}\,)|(\*\/))*('.($dateTime[2]).'){1}(\,\d{1,2})*)\s'.
'(\*|((\d{1,2}\,)|(\*\/))*('.($dateTime[3]).'){1}(\,\d{1,2})*)\s'.
'(\*|(([1-6]{1}\,)|(\*\/))*('.($dateTime[4]).'){1}(\,[1-6]{1})*)$/i'
));

$cursor = $collection->find(array("sendRule" => $joe_search));

sendRule-cronルールを含むデータベース内のフィールドの名前。
$ dateTime [0](分)の先頭にゼロを付けることができます(たとえば、05分)。そのため、1を掛けてゼロを削除します。

テスト済み* 1.12.20 7.8.12 * * / 3(水曜日の毎月7.8.12日に毎分1.12および20時間)。

以上で、結果の配列をループし、必要なものをすべて送信します。

Source: https://habr.com/ru/post/J139586/


All Articles