Zend Framework ile cronjob oluşturun

13 Cevap php

Ben bir cronjob denetleyicisi yazmaya çalışıyorum, bu yüzden bir web sitesi aramak ve tüm modülleri idam cronjob.php olabilir. Şimdi benim sorunum ben nasıl yapabilirim nedir?

Bir seçenek olabilir kıvırmak olur, bu yüzden ben de hataları ve başarıları güvenebilirsiniz?

[Güncelleme]

Ben yeterince izah değil sanırım.

Ne yapmak istiyorum ben http://server/cronjob adlı gibi aramak ve sonra her / application / modules / * / denetleyici / CronjobController.php yürütmek ya da bunu yapmanın başka bir yolu var yapabilir bir dosya tüm CronJobs bir yerde değil ama aynı yerde modül yer almaktadır. Bu bir modül yoksa onun cronjob çalıştırmayı deneyin olmadığını, bana avantaj sunacak.

Şimdi soru nasıl tüm modüller CronjobController yürütülür veya hala modüler kalır yani bunu tamamen farklı bir şekilde yapmak istiyorsunuz nedir?

Ve birçok CronJobs başarıyla koştu ve kaç vermedi nasıl giveout edebilmek olmak istiyorum

13 Cevap

After some research and a lot procrastination I came to the simple conclusion that a ZF-ized cron script should contain all the functionality of you zend framework app - without all the view stuff. I accomplished this by creating a new cronjobfoo.php file in my application directory. Then I took the bare minimum from: -my front controller (index.php) -my bootstrap.php

Ben tüm görünümü şeyler çıkardı ve çevre kurulum, db kurulumu, autoloader & tutmak odaklı kayıt kurulumu. Ben belge kök değişkeni düzeltmek ve benim bootstrap kopyalanan OO işlevselliği bazı kaldırmak için biraz zaman vardı.

Bundan sonra ben sadece benim durumumda bu derleme ve gece raporları e-posta edildi .. uzakta kodlu. Bu Zend_Mail kullanmak için harika oldu. Ben komut istediğim şekilde çalışıyordu emin olunca, ben sadece bunu benim crontab'ın ekledi.

iyi şanslar!

Zend Framework için ben şu anda kod özetlenen feryat kullanıyorum. Script sadece tüm yolları, çevre ve diğer Zendy kod önyükleyicisini bir portal dosya index.php içerir. Cron komut sabit tanımlayarak biz uygulamayı çalıştırmak son adım, iptal.

Bu uygulama yalnızca kurulum, hatta önyükleyicisini olmadığı anlamına gelir. Bu noktada biz gereken kaynakları bootstraping başlatmak ve bu olduğunu

//public/index.php

if(!defined('DONT_RUN_APP') || DONT_RUN_APP == false) {  
    $application->bootstrap()->run();
}

// application/../cron/cronjob.php

define("DONT_RUN_APP",true);
require(realpath('/srv/www/project/public/index.php'));
$application->bootstrap('config');
$application->bootstrap('db');

//cron code follows

Ben onların normal zamanlarda dışarıdan tetiklenir ve onlar ne bağlı olabilir çünkü halka erişilebilir cronjobs koyarak dikkatli olur, problemleri (ben size niyetinde olmadığını biliyorum, ama gerçek bir denetleyici içine koyarak o ulaşılabilir hale neden browser). Örneğin, e-postalar gönderir bir cron var. Birisi cron URL buldu ve sadece onu vurmaya başladı ben sürekli istenmeyen olacaktır.

Ne yaptım bir cron klasör yapmak ve orada benim için Zend Framework (eksi MVC) göbeğini bir heartbeat.php yarattı. Bu onları çalıştırmak için zaman ise, cron işin sınıfının bir örneğini oluşturur ve çalıştırır, tüm yüklü cron işlerin bir listesini içeren bir veritabanını denetler ve.

Cron işleri vb çalıştırmak yüklemek gibi yöntemler vardır soyut bir cron sınıftan sadece çocuk sınıflar (), (), devre dışı bırakmak () vardır

İşimi ateşlemesi sadece heartbeat.php vurur her 5 dakikada bir çalışan bir basit crontab girdisi var. Şimdiye kadar iki farklı sitelerde harika çalıştı.

Birisi fw-genel bir kaç gün önce this blog entry bahsedilen (a mailinglist hangi Seni Zend Framework kullanırken okuma tavsiye).

Er ya da geç bu hitap etmelidir Zend_Controller_Request_Cli için bir öneri de var.

Ben özel bir sunucuya erişimi ve başlangıçta cron işleri için farklı bir yükleme alanı vardı. Ben sonunda sadece ben şeyler etrafında hareket hakkında rahatsız mevcut MVC kurulum içinde bu yapamadı ve isteyen, fikir nefret ediyordu.

Ben kaydedilmiş bir dosya cron.sh, (kamu değil) sitemde kök içinde oluşturulan ve içinde ben çalıştırmak istiyorum komutları bir dizi koymak. Ben her zamanki gibi benim denetleyicileri içinde PHP yazdı ve cron.sh. içinde bu adresler kıvırmak aramaları ekledi kerede çok komutları çalıştırmak istedim Örneğin curl http://www.mysite.com/cron_controller/action Sonra cron arayüzünde koştum bash /path/to/cron.sh.

Başkaları tarafından işaret olarak Crons olduğunu ihtar her zaman var yani url tahmin herkes tarafından ateş olabilir. Birçok farklı şekillerde buna bir çözüm bulabilirsiniz.

Bir göz atın zf-cli:

Bu da tüm cron işleri yönetir.

Neden sadece dahil olmak üzere, ya da index.php önyükleme dosyası gerektiren bir crontab.php oluşturmak değil mi?

Önyükleme Zend_Loader::registerAutoload(), sen modülleri ile doğrudan çalışmaya başlayabilirsiniz yürütülürken göz önüne alındığında, örneğin, myModules_MyClass::doSomething();

Eğer kontrolörleri atlama olduğunu yoldur. Kontrolör iş http üzerinden erişimi kontrol etmektir. Eğer yerel erişen çünkü bu durumda, denetleyici bir yaklaşım gerekmez.

http://framework.zend.com/wiki/display/ZFPROP/Zend_Scheduler+-+Matthew+Ratzloff?rootCommentId=1819 Ben Googleing tarafından bu bağlantı bulundu oldukça lutfen interessting gibi görünüyor.

Onun Ben ne arıyorum sessiz ama ben kendime zorunda için ben aradığı şeyi bulmak için görünmüyor olabilir eğer. Değil

Eğer modules 'dizinlere dosya sistemi erişimi var mı? Sen üzerine dizin yineleme ve bir CronjobController.php mevcut olduğu tespit olabilir. Yerel gerçek gönderme sürecini simüle: Sonra Zend_Test_PHPUnit Zend_Http_Client gibi bir yaklaşım HTTP üzerinden erişim denetleyicisi ya da kullanmak için kullanabilirsiniz ya.

Sen (kendi modülleri) cronjob komut başvurular tutacak bir veritabanı tablosunu kurmak olabilir, o geçişte bir geri dönüş değerine sahip bir exec komutunu kullanın / başarısız.

I this post ile gregor cevap uzatıldı. Bu çıktı budur:

//public/index.php 

// Run application, only if not started from command line (cli)
if (php_sapi_name() != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) {
    $application->run();
}

Teşekkürler Gregor!

Benim çözüm:

  • kıvırmak / cron
  • Küresel cron yöntem tüm denetleyicileri include_onceyi olacak
  • Controllors her olup olmadığını kontrol edin -> cron yöntemi
  • Onlar varsa, bu çalıştırın.

(Kıvrılma için) Kamu cron url bir sorun değildir, kötüye önlemek için pek çok yolu vardır. Dediği gibi, uzak IP kontrol kolayıdır.

This is my way to run Cron Jobs with Zend Framework

Eksi MVC olduğu gibi Bootstrap Ben çevre kurulum devam edecektir In:

public static function setupEnvironment()
{
     ...
     self::setupFrontController();
     self::setupDatabase();
     self::setupRoutes();
     ...
     if (PHP_SAPI !== 'cli') { 
          self::setupView();
          self::setupDbCaches();
     }
     ...
}

Ayrıca Bootstrap, ben setupRoutes değiştirmek ve özel bir rota katacak:

public function setupRoutes()
{   
    ...
    if (PHP_SAPI == 'cli') { 
        self::$frontController->setRouter(new App_Router_Cli());
        self::$frontController->setRequest(new Zend_Controller_Request_Http());        
    }
}

App_Router_Cli is a new router type which determines the controller, action, and optional parameters based on this type of request: script.php controller=mail action=send. I found this new router here: Setting up Cron with Zend Framework 1.11 :

class App_Router_Cli extends Zend_Controller_Router_Abstract 
{
    public function route (Zend_Controller_Request_Abstract $dispatcher) 
    {
        $getopt = new Zend_Console_Getopt (array());
        $arguments = $getopt->getRemainingArgs();
        $controller = "";
        $action = "";
        $params = array();

        if ($arguments) {

            foreach($arguments as $index => $command) {

                $details = explode("=", $command);

                if($details[0] == "controller") {
                    $controller = $details[1];
                } else if($details[0] == "action") {
                    $action = $details[1];
                } else {
                    $params[$details[0]] = $details[1];
                }
            }

            if($action == "" || $controller == "") {
                die("Missing Controller and Action Arguments == You should have: 
                     php script.php controller=[controllername] action=[action]");
            }
            $dispatcher->setControllerName($controller);
            $dispatcher->setActionName($action);
            $dispatcher->setParams($params);

            return $dispatcher;
        }
        echo "Invalid command.\n", exit;
        echo "No command given.\n", exit;
    }

    public function assemble ($userParams, $name = null, $reset = false, $encode = true)
    {
        throw new Exception("Assemble isnt implemented ", print_r($userParams, true));
    }
}

CronController Ben basit bir kontrol yapın:

public function sendEmailCliAction()
{   
    if (PHP_SAPI != 'cli' || !empty($_SERVER['REMOTE_ADDR'])) { 
        echo "Program cannot be run manually\n";
        exit(1);
    } 
    // Each email sent has its status set to 0;

Crontab bu tür bir komutu çalıştırır:

    * * * * * php /var/www/projectname/public/index.php controller=name action=send-email-cli >> /var/www/projectname/application/data/logs/cron.log