Cron yeterli olmadığı zaman ben ne kullanıyorsunuz?

4 Cevap php

Ben birkaç kez oldukça ağır bir PHP görev binlerce bir gün çalışan için en verimli şekilde anlamaya çalışıyorum. Bu Gmail, e-postalar üzerinde döngü, bir IMAP bağlantısı veritabanına bu bilgileri kaydetmek ve yerel olarak görüntüleri kaydetmek yapmak gerekiyor.

Bir cron kullanarak her öylesine sık sık bu görevi çalıştıran bir anlaşma büyük değil, ama ben her dakika çalıştırmak gerekiyor ve ben sonunda Crons birbirlerinin üstüne yayınlanmaya başlaması ve hafıza sorunlarına neden biliyorum.

Eğer verimli bir görevin birden çok kez bir dakika çalıştırmak için gereken zaman bir sonraki adım nedir? Ben Beanstalk ve hakkında okuma oldum pheanstalk ve ben ne gerek yapacak tamamen emin değilim. Düşünceler??

4 Cevap

Komut üst üste olmayacak şekilde bir kilitleme mekanizması oluşturmak ya. . Komut sadece basit bir kilit dosyası yeterli olacaktır, her dakika, koşmak gibi bu oldukça basittir:

<?php
  if (file_exists("foo.lock")) exit(0);
  file_put_contents("foo.lock", getmypid());

  do_stuff_here();

  unlink("foo.lock");
?>

Bu kesin komut paralel çalışmaz hale getirecek, sadece. Kilit dosyası silinir emin olduğunda program çıkar, sen (başında çıkış hariç) çıkış tek bir nokta var bu yüzden.

İyi bir alternatif - Brian Roach önerdiği gibi - her zaman çalışır ve IMAP sunucusu up bağlantı tutar özel bir sunucu süreçtir. Bu havai çok azaltır ve normal bir php script yazarken daha çok zor değil:

<?php
  connect();
  while (is_world_not_invaded_by_aliens())
  {
    get_mails();
    get_images();
    sleep(time_to_next_check());
  }
  disconnect();
?>

Ben bir PHP adam değilim ama ... ne bir daemon olarak komut çalıştırmanızı engeller? Ben sadece bunu yapmaz pek bir Perl yazdım.

Ben onlar-up yığını halinde cron'nun onları çalıştırmak istemiyorum, bu gibi komut, bir dizi var.

#!/bin/sh
php -f fetchFromImap.php
sleep 60
exec $0

exec $0 kısım komut bellekte kendisi yerine, tekrar çalışıyor, bu yüzden sorunlar olmadan sonsuza kadar sürecek başlar. PHP komut dosyası kullanan herhangi bir bellek çıktığında ne zaman temizlenir, böylece bir sorun da değil edilir.

Basit bir satır başlatmak ve arka içine koyacağız:

cd /x/y/z ; nohup ./loopToFetchMail.sh &

Makine çeşitli araçlarla başlar ya da benzer şekilde başlamış olabilir (örneğin Cron adlı gibi 'reboot @ ....')

fcron http://fcron.free.fr/ eski hala çalışıyorsa, Sizin yarış koşulları dert @ 1 command kullanıp, yeni bir işe başlamak olmaz.