Nasıl bir gün ve çıkış sonuçları cron kullanarak düz bir dosya bir kez sorgu yürütmek mi?

5 Cevap php

Ben çıkış için ana sayfada bir DB / tablosundaki girişlerin # istediğiniz bir PHP/MySQL bir web sitesi var, ama ben bir kullanıcı ana sayfa vurur her zaman bu sorguyu yapmak istemiyorum. Ben otomatik olarak ben sonra sadece içerebilir düz bir dosyaya günde bir kez ve çıkış sorgu sonuçları çalıştırmak istiyorum. Ben bu yük biraz azaltmak gerekir rakam.

Ben daha önce bir cron işi bitmiş, ne de Unix sistem / komutları ile süper tanıdık hiç. Sitem Plesk kontrol paneli vardır bir ISP ile ve bana cron işleri ayarlamanızı sağlayan bir "crontab" bölümüne bakın.

Ben ne girileceğini "komutu" oldukça emin değilim. Ben sadece iyi sorgu formüle, ama emin değilim nasıl PHP ile içerebilir düz bir dosyaya çıktı sonuçlarını yapabilirsiniz. Ayrıca, ideal, düz dosya (sitenin geri kalanı ile) web kök dizininde görünür ve her geçen gün kendini yazar ederim, yıl sonunda 365, düz dosyaları ile sona istemiyorum.

5 Cevap

Bütün işi yapmak için tek başına bir PHP komut dosyası yazmak, ve sadece bu gibi crontab eklemek gerekir:

0 2 * * * cd /path/to/script; /usr/bin/php daily.php 1> output.txt 2> errors.log

Lütfen daily.php çalıştırılacağını her 02:00 de, çıkış output.txt içinde ve üretilen herhangi bir hata (display_errors bırakın açık) errors.log sona erecek. Bu, düz cron içine queyr koyarak üzerine birkaç avantajı vardır:

  • Sen cron içine mysql bağlantı bilgilerinizi koymak gerekmez
  • Eğer ihtiyacınız varsa sitenizin PHP herhangi bir dosya include edebilir
  • Bunu çalıştırmak için cron beklemeden komut tek başına test edebilirsiniz.

Muhtemelen PHP sayfaları verileri dahil etmek için en kolay ve en güvenli yolu sorguları sonuçlarının serialize() bir dizi ve daha sonra unserialize () size ihtiyacınız olduğunda:

// daily.php
$data = array(
    'rows_in_table_foo' => 2343, // replace this with a query result
    'rows_in_table_bar' => 4321, // replace this with a query result
    );
echo serialize($data);
exit 0;

... Ve okumak için ...

// index.php
$data = unserialize(file_get_contents('output.txt'));

Bu barındıran sistem üzerinde daha fazla bilgi olmadan doğru almak biraz zor olabilir. Mevcut mysql komut satırı istemcisi varsa böyle bir şey deneyebilirsiniz:

/usr/bin/mysql -u db_user --password=db_password -e "SELECT COUNT(*) INTO OUTFILE '/tmp/myoutfile.txt' FROM my_table;" my_database

Bu çağrı "DB_USER", "db_password" gibi şeyler, vb değiştirmek zorunda olduğunu unutmayın. Ayrıca /usr/bin sadece müşteri benim sistemde bulunan dizin olur unutmayın. Bu hosting platformu üzerinde farklı olabilir.

Web ön uç doğrudan kabuk komutları çalıştırmak izin verirse, ben ilk komutu şey yanlış veya eksik ise, bu daha iyi geri bildirim vermelidir olarak bu şekilde denemek istiyorum.

PHP kodlama daha rahat hissediyorsanız, başka bir çözüm crontab denen komut dosyası oluşturma / dosyasını güncelleme var ve işini yapar küçük bir PHP script yazmak olacaktır:

/path/to/php/bin/php /path/to/my/phpscript.php

Tabii ki, bu PHP sisteminizde mevcut olan komut satırı sürümü bağlıdır.

Eğer soru bir crontab parçası için, sadece (komut "crontab-e" ile düzenleme) komutu crontab'ınıza böyle bir şey ekleyebilirsiniz:

0 0 * * * COMMAND TO EXECTUTE QUERY > THE_FILE

Sadece kendi içeriğini overwrithing, THE_FILE sorguyu her gün ve boruları onun sonucu idam edilmektedir.

Bir crontab giriş biçimi:

minutes hours day_of_month month day_of_week COMMAND

Peki ilk kapalı onun "cron" ve uygulamak onun oldukça kolay denir .. Bu konuda biraz bilgi kontrol: http://en.wikipedia.org/wiki/Cron ve bir başlangıç ​​kılavuzu: http://www.unixgeeks.org/security/newbie/unix/cron-1.html.

Trafik hacmi ne bu sitede görmek için bekliyorsunuz? Bir sorgu kapalı ateş çoğu durumda büyük bir sorun olacağını neden görmüyorum ...

  • Nicholas

Sorunuzu özetlemek sağlar. Sen bunu nasıl yaparsın, sorgu sonuçlarını önbelleğe istiyorsun?

Eğer soruyu yanıtlamadan önce bir çözüm (düz dosyasında saklamak) teklif ediyorsun. Yani emin olun, bunu yapabilirsiniz. Ama altyapı biraz oluşturmak için gidiyoruz eğer, neden bir önbellek veri sınıfı yazmak ve her türlü malzeme önbelleğe değil. Bu 3 özelliklere sahip olabilir

-- cache item name -- cache item value -- cache item last update timestamp

Birkaç işlevler eklemek

function loadCachedData($itemName);

//see if more time has passed than in the cache expiration window 
function isLoadedDataFresh($expirationWindowInSeconds);

function getLoadedItemValue();

function storeCacheValueForItem($itemName, $value);

Zaten denetleyicisi, sadece bu yapmak, böylece öğeyi seçmek için sorgu yazmak zorunda:

$cacheHandle = new Cache();

$cacheHandler->loadCachedData('whateverMyVarIs');

$displayValue = '';
if($cacheHandler->isLoadedDataFresh(60 * 60 * 24) ) //sec*min*hour = 1 day
{
    $displayValue = $cacheHandler->getLoadedItemValue();
}
else
{
    //update the display value here with your real query
    $displayValue = doMyStuff();
    $cacheHandler->storeCacheValueForItem('whateverMyVarIs', $displayValue);

}

tabii ki, sen, o kodun defolup temizlemek sabitleri içine aşımı süresi pencereler açmak ve sınıf uygulamak zorunda olacak, ama bu zor tooo olmamalıdır. Artı, zaten sadece uzakta önbellek o ile sınıf ve önbellek geri .. bir db var! Hızlı önbelleğe alma için daha iyi bir aracı kullanmak istiyorsanız veya memcached ile gitmek! http://www.danga.com/memcached/

Ama sonunda, ben sadece erken optimize edilir ... sormak gerekir? Birisi gerçekten bu sayfada performansı hakkında şikayet?