CakePHP ile uyarılar gönderiyor Yaklaşım

3 Cevap php

Bu yüzden benimle çıplak lütfen oldukça belirsiz bir sorudur. Bu sözdizimi daha yaklaşımı hakkında daha fazla bulunuyor.

Ben 'bildirimler' (id, User_id, tarih, vb) ile dolu bir MySQL tablo var. Ben bir uyarı göndermek zorunda (e-posta yoluyla, facebook, twitter, neyse ... sorun değil) ne zaman 'gerçek' gibi bu kayıtlar ping her. Burada bir şey nasıl doğru / yanlış belirlemek koşullar hesaplanacak olan mümkün olan en verimli şekilde ve gerçek onları ping hakkında gitmek gerekir, değil mi?

Bir bday bir e-posta gönderme kolaydır. Sadece bugünün tarihi için bir tarih alanını arayın. Eğer alanına girilen bir tarihten itibaren her 20 gün e-posta tr göndermek zorunda varsayalım? Ben bugün doğru olmadığını görmek için her satır hesaplamak zorunda.

Bunu nasıl yapmalıyım? Her satırda aracılığıyla çalıştırmak bir PHP sayfası Cron 1 karmaşık bir MySQL sorgu 2 ve saçımı çekerek ve oda çığlık dışında çalışan her x saniyede / dak 3 1 ile 1 yaptığımız gibi onları işaretleyin:.. Aşağıdaki kabul ettik. Küçük bir kız gibi. Ben şu anda 3 doğru eğilim.

Benim ana endişe paylaşılan bir sunucu üzerinde ve ben çok yoğun bir şey yapmak istemiyorum olmasıdır. Bu beyninizi geçirmek için teşekkürler. Bunu takdir ediyorum.

3 Cevap

Sen strtotime() örneklere bir göz var ve bu Gönderdiğiniz uyarısı türlerini uyum görmek gerekir. Bu yıllık hatırlatması (doğum) gibi şeyleri temsil izin verebilir, her 20 gün uyarıları, aylık uyarıları tablodaki (her ayın ilk Pazartesi günü / son Cuma) şöyle:

|   id | user_id | status  | send_on             | next_occurrence    |
|------|---------|---------|---------------------|--------------------|
| 1001 |     123 | pending | 2010-03-04 12:00:00 | Next March 4 noon  |
| 1002 |     123 | pending | 2010-02-05 00:00:00 | +20 days midnight  |
| 1003 |     123 | pending | 2010-02-01 08:00:00 | First Monday 8am   |

Daha sonra bir CRON işi bazı oldukça basit bir kod ile her on dakika kadar patlar (paylaşılan bir bilgisayar ya da yoksul adamın CRON) kurmak:

# get pending alerts
$alerts = $this->Alert->find('all', array(
    'conditions' => array(
        'send_on <=' => date('Y-m-d H:i:s'),
        'status'     => 'pending',
    ),
));
# send alerts
foreach ($alerts as $alert) {
    # send alert and update status
    $status = $this->Something->send($alert);
    $status = ($status) ? 'sent' : 'failed';
    $this->Alert->id = $alert['Alert']['id'];
    $this->Alert->saveField('status', $status);
    # generate and save next pending occurrence
    $this->Alert->create();
    $this->Alert->save(array('Alert' => array(
        'user_id'         => $alert['Alert']['user_id'],
        'status'          => 'pending',
        'send_on'         => strtotime($alert['Alert']['next_occurrence']),
        'next_occurrence' => $alert['Alert']['next_occurrence'],
    )));
}

5 Mart Hızlı ileri bu yıl aynı tablo şimdi bu gibi görünüyor:

|   id | user_id | status  | send_on             | next_occurrence    |
|------|---------|---------|---------------------|--------------------|
| 1001 |     123 | sent    | 2010-03-04 12:00:00 | Next March 4 noon  |
| 1002 |     123 | sent    | 2010-02-05 00:00:00 | +20 days midnight  |
| 1003 |     123 | sent    | 2010-02-01 08:00:00 | First Monday 8am   |
| 1004 |     123 | sent    | 2010-03-01 08:00:00 | First Monday 8am   |
| 1005 |     123 | sent    | 2010-02-25 00:00:00 | +20 days midnight  |
| 1006 |     123 | pending | 2010-03-17 00:00:00 | +20 days midnight  |
| 1007 |     123 | pending | 2010-04-05 08:00:00 | First Monday 8am   |
| 1008 |     123 | pending | 2011-03-04 12:00:00 | Next March 4 noon  |

Aşağıda biraz ben periyodik karmaşık koşullar değişen dayalı sms ve e-postalar göndermek için gereken benzer bir durum yaklaştı nasıl açıklama basitleştirilmiştir:

Ben 2 yeni tablolar oluşturuldu:

  • senaryoları (id, isim; frekans)
  • süreçler (id; scenario_id, process_type, execution_type; süreci)

ile:

  • scenario.frequency:, saatlik, günlük, haftalık veya aylık
  • processes.process_type: filtre veya eylem
  • processes.execution_type: sql veya fonksiyon

Sonra senaryolar masa çukur gitmek ve uygun frekansta senaryoları almak ve ilişkili filtre (bir sql deyimi veya bir php fonksiyonu olabilir) toplamak için bu frekanslara göre bir cron kurmak. Filtre herhangi bir sonuç dönerse sonuçları ile ilişkili eylemleri gerçekleştirebilirsiniz. Ben de onları güvenli bir şekilde harekete önce benim senaryoları test böylece kurulum, test ve devrelerde gerçekleştirmek için bu sistemi uzatıldı.

Cheers - Umarım bu yardımcı olur

You might want to look into a queue service ala beanstalk etc. I know with some of them you can post actions / events into your queue and set them to be periodic, conditional etc.

Kuyruk sunucuları / hizmetler büyük bir konudur, ama belki sadece biraz daha fazla seçenek ve düşünce bazı alternatif trenler var verecek bu out atılmış sahip.