PHP bir dosya tanıtıcısı açma genel giderler?

4 Cevap php

Ben bir dosyaya mesajlar yazıyor bir giriş aracı yazıyorum, ve ben dosya işaretçisi ile başa çıkmak için en iyi yolu emin değilim. Ben bu iki yöntem arasında savurma ediyorum:

// Open, Write, Close; Open, Write, Close...
function write($message) {
    $fh = fopen('file.log', 'a');
    fwrite($fh, $message . "\n");
    fclose($fh);
}

// OR -----

// Open, Write, Write, Write..., Close
function __construct() {
    $this->fh = fopen('file.log', 'a');
}
function __destruct() {
    fclose($this->fh);
}
function write($message) {
    fwrite($fh, $message . "\n");
}

Büyük olasılıkla olacak ama ben, bu sınıf yüklenir ve her sayfada inşa, ama mutlaka kullanılmaz olacağını düşünün.

Performans, güvenlik veya yöntem ve hangi tavsiye ederim ya çeşitli tuzaklar var mı?

4 Cevap

Sana bir sayı veremem, ama sadece kapatmak ve tekrar tekrar yeniden bir dosyayı açmadan size bir maliyeti olacak. Ve ben işletim sistemi düzeyinde, sadece PHP de konuşuyorum. Tanıtıcı kapatmak için başka syscall sonra, (Windows konuşmak veya CreateFile()), open() için çekirdeğin içine Calling dosya sistemindeki kişilere yol dizeleri eşleşen, diskten dizin yapısı okuma. .. Bu sayıda varsa Özellikle ben çok bu kaçınmakla olur. Ya tamam, bazı ölçümler görmek için olsun.

Eğer hiç kullanılmayacak bir şey için maliyet üstlenmeden endişe ediyorsanız, bu iki yaklaşımın bir karışımı kabul var? Bu dosya, aksi takdirde eski kolu yeniden, zaten açık değilse yazma açık bir yapıyor, bir ...

Eğer giriş yapıyorsanız ne bağlıdır.

Gerçekten ikinci versiyonu en iyisidir. Bu gibi düşünün:

Siz talep döngüsü sırasında oluşan hataları günlüğe kaydetmek istediğiniz. Diyelim ki istek sırasında 3 hataları olsun diyelim. Eğer açılış ve Dosyaya fazla yükü neden 3 kez kapatıyoruz ilk yöntemini kullanın. Eğer logger sınıfın aynı örneği kullanıyorsanız, yalnızca bir kez dosya açma ve istek sırasında kendisine 3 satırları yazarken.

Umarım bu sizin için bir şeyler temizler.

İsteğe bağlı olarak ilk yönteme bir dosya işaretçisi geçebilir ve sadece yöntem yazma gerçekleştirmek var.

İşte alternatif bir versiyonudur:

function log($message) {
  global $_log;
  if (!defined(LOG_OPEN)) {
    define(LOG_OPEN, true);
    $_log = fopen('filename.log', 'w');
    register_shutdown_function('close_log');
  }
  fwrite($_log, $message . "\n");
}

function close_log() {
  global $_log;
  fclose($_log);
}

Bir mesaj yazarken en azından bundan sonra sadece günlüğünü açıyoruz.

Size bir maliyeti olacaktır. Ağ gecikme maliyetleri ve etajer büyük düzeni ben dosyaları çok açılış başlatmak sürece önemli olacak şüphesiz. Ben bu bir günlük bile etkisi ölçülebilir olacağını sanmıyorum.

İkinci yöntem IMO, tabii ki daha iyidir. Açılış ve bir dosya tanıtıcı kapanış bir maliyeti var ve nispeten küçük olmasına rağmen bu uygulama içinde bir sürü eğer bu çok nadir bir şey, eğer bir fark olmaz rağmen, (yeraldığını kadar eklese I) sanmıyorum. Hiç bazı ekstra kurulum veya temizleme işlevsellik eklemek gerekirse, sadece __construct / __destruct yöntemine bazı kod eklemek çünkü, ikinci yöntem, temiz olacaktır.