スケジュールされた投稿(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時間)。



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



All Articles