Yem getiriliyor Optimize

4 Cevap php

Hello I'm working on a site now that have to fetch users feeds. But how can I best optimize fetching if I have a database with, lets say, 300 feeds. I'm going to set up a cron-job to which fetches the feeds, but should I do it like 5 every second minute or something?

Herhangi bir PHP bu en iyi şekilde yapmak için nasıl bir fikir?

4 Cevap

Yeni bilgilere dayanarak ben böyle bir şey yapacağını düşünüyorum:

Let the "first" client initiate the updatework and store timestamp with it. Everey other clients that will ask for the information get a cashed information until that information are to old. Next hit from a client will then refresh the cashe that then will be used by all clients till next time its to old.

Aslında updatework başlatacağız istemci, Fin bunun için beklemek zorunda sadece eski paraya sürümünü serv ve iş yapılır kadar bunu yapmaya devam etmemelidir.

Dont bu şekilde hiç istemcileri isteyen varsa anything güncellemek zorunda.

Size soru anlamak, temelde bir besleme agregator sitede çalışıyoruz?

Aşağıdaki yapabilirsiniz; (örneğin) her 1 hor serinletici başlayın. Bazı yem anough girdileri varsa - girişler arasındaki ortalama süreyi hesaplamak. Sonra bu yem alma için bir zaman aralığı olarak bu aralığı kullanabilirsiniz.

Site son 7 günde 7 yayınlanmış makaleleri Örneğin, - bunu her 24hours (1day) beslemeleri getirebilir.

Ben bu ortalama süreyi hesaplamak zaman ben (çok nadiren almak için değil emin olmak için) 2 bölün birkaç değişiklik ile bu algoritma kullanır. Sonuç en az 60 dakika ise - ben 1 saate aralığını ayarlamak veya ben 24 saat olarak ayarlayın 24 daha büyük.

Bunun gibi, örneğin, bir şey:

    public function updateRefreshInterval() {
            $sql = 'select count(*) _count ' .
                    'from article ' .
                    'where created>adddate(now(), interval -7 day) and feed_id = ' . (int) $this->getId();
            $array = Db::loadArray( $sql );

            $count = $array[ '_count' ];

            $interval = 7 * 24 * 60 * 60 / ( $count + 1 );
            $interval = $interval / 2;
            if( $interval < self::MIN_REFRESH_INTERVAL ) {
                    $interval = self::MIN_REFRESH_INTERVAL;
            }
            if( $interval > self::MAX_REFRESH_INTERVAL ) {
                    $interval = self::MAX_REFRESH_INTERVAL;
            }

            Db::execute( 'update feed set refresh_interval = ' . $interval . ' where id = ' . (int) $this->getId() );
    }

Tablo 'yenilenme' besleme son kez yenilendi ve 'yenileme_aralığı' aynı yem iki fetches arasındaki istenilen zaman aralığıdır oldu zaman etiketi olan, 'yem' edilir.

Yapılacak en iyi şey, gereksiz istekleri sürü beslemeleri aşırı 'güzel' değil, olmaktır. Ben güncellemeleri için yaklaşık 150 bloglar izler benim webapps biri için 1 saatlik güncelleme zamanında yerleşti. Ben geçen veritabanında kontrol ve bunları güncellemek için ne zaman karar için kullanabilirsiniz edildi zaman saklayın. Hepsi aynı anda güncellenir değil bu yüzden yemler rasgele zamanlarda eklendi.

I pfetch Benim için bunu yazdım. Bu küçük, ama bir çift gerçekten önemli bir yönü vardır:

  1. Bu bükülmüş yazılmış oluyor ve ağ yavaş olsa bile büyük eşzamanlılık işleyebilir.
  2. Herhangi bir cron yarış ya da bir şey gerektirmez.

Benim cron tabanlı Fetchers bir sorun haline çünkü ben aslında bunu yazdım. Şimdi ben internet etrafında istediğiniz bazı rastgele şeyler almak için yapılandırılmış ve sonra işler benim kendi web sitesi parçaları güncellemek için her değiştirdiğinizde komut dosyaları çalışır var.