file_exists () PHP çok yavaş.

13 Cevap php

Sitemizde görüntüleri görüntülerken dosya file_exists() çağrısı ile varsa, biz kontrol. Dosya eksik eğer Biz bir kukla görüntüye geri düşmek.

Ancak, profil bu file_exists() dosya başına 1/2 ms kadar çekici ile sayfaları oluştururken en yavaş parçası olduğunu göstermiştir. Biz sadece 40 ya da öylesine dosyaları test edilir, ama bu yine 20ms sayfa yükleme süresi üzerine iter.

Can anyone suggest a way of making this go faster? dosyası varsa test iyi bir yolu var mı? Bazı tür bir önbellek oluşturmak, nasıl senkronize tutmak gerekir.

13 Cevap

file_exists() çok ucuz bir işlem olmalıdır. File_exists performansı ile yardımcı olmak için kendi önbelleği oluşturur olduğunu da unutmayın.

Bkz: http://php.net/manual/en/function.file-exists.php

Eğer göreli dosya yolları kontrol eğer Use absolute paths! sizin include_path ayarı PHP kontrolleri bütün (!) Bu dirs bağlı! Sen include_path geçici varlığını kontrol etmeden önce yoketmek olabilir.

realpath() aynı işi yapar ama daha hızlı olup olmadığını bilmiyorum.

Ama dosya erişim I / O her zaman yavaş. Bir sabit disk erişimi normal, işlemci şey hesaplanırken daha IS yavaş.

Dosya eksik eğer Biz bir kukla görüntüye geri düşmek

Eğer geri bu kukla görüntüye düşen sadece ilgilenen iseniz, müşteri dosyasına-bulunamadı üzerindeki (kukla görüntüye) bir yönlendirme vasıtasıyla sunucu ile müzakere icar düşünebilirsiniz.

Bu şekilde sadece küçük bir yönlendirme yükü ve istemci tarafında bir-fark edilmez gecikme olacak. En azından file_exists için (biliyorum, hangi değil) "pahalı" çağrı kurtulmak gerekir.

Sadece bir düşünce.

file_exists() PHP tarafından otomatik olarak önbelleğe alınır. Ben bir dosyanın varlığını kontrol etmek için PHP daha hızlı işlevini bulacaksınız sanmıyorum.

Bkz this thread.

Hepsi aynı dizinde? Bu yüzden may dosyaların listesini almak ve bir karma saklayarak ve yerine tüm File_exists aramaları daha o karşılaştırılarak değer eğer.

Ne glob hakkında (?) Ama bu hızlı emin değilim.

http://www.php.net/manual/en/function.glob.php

Birden fazla alt-dizinlere dosyaları Sharding için bir müzakere rutin oluşturun.

dosyaadı.jpg -> 012.345 -> / 01/23/45.jpg

Ayrıca, 404 resim dizinine istekleri için yer tutucu resim dönmek mod_rewrite kullanabilirsiniz.

Ben tam olarak ne yapmak istediğinizi biliyorum, ama olabilir sadece let the client handle it yok.

Bir yerel dosyanın varlığını kontrol etmek için en hızlı yoludur stream_resolve_include_path() :

if (false !== stream_resolve_include_path($s3url)) { 
  //do stuff 
}

Performans sonuçları, stream_resolve_include_path() vs file_exists(),

Test name       Repeats         Result          Performance     
stream_resolve  10000           0.051710 sec    +0.00%
file_exists     10000           0.067452 sec    -30.44%

In test used absolute paths. Test source is here. PHP version:

PHP 5.4.23-1~dotdeb.1 (cli) (built: Dec 13 2013 21:53:21)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

Ben çağrı başına 1/2ms çok, çok uygun buluyorum. Dosya fonksiyonları dosya işlemlerini işlemek alt katmanları çok yakın olarak ben, çok daha hızlı alternatifler çevresinde bulunmaktadır sanmıyorum.

Sen ancak memcache veya benzer tesis haline file_exists bir sarıcı () o önbelleklerini sonuçları yazabilirsiniz. Yani günlük kullanımda hiçbir şey yanındaki süresini azaltmak gerekir.

Periyodik DB / dosyasındaki görüntülerin bir listesini oluşturmak ve bunları saklamak için bir cronjob yapabileceği / BDB / ...

Her yarım saatte bir olmak güzel, ama silme / dosya eklenmesi durumunda önbelleğini sıfırlamak için bir arayüz oluşturmak için emin olmalıdır.

Ve sonra, onu bulmak çalıştırmak da kolay. -Mmin kabuk -30-print0 ve yeni dosya eklemek.

Ben bu daha hızlı olacak bile emin değilim ama yine de soooo kriter istiyorum gibi görünür:

Build a cache of a large array of all image paths.

$array = array('/path/to/file.jpg' => true, '/path/to/file2.gif' => true);

Önbelleği hourly veya daily kendi gereksinimlerine bağlı olarak güncelleyin. Bunu yapacağını cron özyinelemeli yolları dizi oluşturmak için dosyaları dizinin geçeceği bir PHP komut dosyası çalıştırmak için kullanan.

Eğer bir dosya olup olmadığını kontrol etmek istediğinizde, sizin önbelleğe dizi yüklemek ve sadece isset() hızlı bir dizi dizin araması için kontrol edebilirim:

if (isset($myCachedArray[$imgpath])) {
    // handle display
}

Orada hala önbelleğini yüklenmesini havai olacak ama umarım bellekte kalmak kadar küçük olacaktır. Eğer birden fazla görüntü varsa sayfa yük önbelleği yüklemek gibi bir sayfada muhtemelen daha belirgin artışı fark edeceksiniz sizin için kontrol ediyoruz.

Eğer bir klasöre dosya kaydettiğinizde yükleme başarıyla olsaydı, bir DB Tablo yolunu saklayabilirsiniz.

Sonra sadece istenen dosyanın yolunu bulmak için veritabanına bir sorgu yapmak zorunda kalacaktır.