最近、ソーシャルネットワークの壁に投稿を送信するためのページを作成する必要がありました。 タスクは、すぐにではなく特定の時間に壁に投稿することでした。
ソーシャルネットワークを選択するためのフィールド、メッセージテキスト、送信時間を入力するためのフィールドを含むページを作成しました。 送信の日付と時刻を選択する通常のカレンダーに加えて、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時間)。
以上で、結果の配列をループし、必要なものをすべて送信します。