PHP'de çok pahalı bir işlem olarak file_exist (?)

7 Cevap php

Ben tasarlarken bir forum motoru avatarları ekliyorum, ben basit bir şey (forum görüntü olarak adlandırılmıştır. Png) yapmak ve dosya görüntülemeden önce mevcut olmadığını kontrol etmek için, ya da bir şey yapmak için PHP kullanmak isteyip tartışmaya değilim biraz daha karmaşık (ama çok değil) ve göstermek için resmin adını içeren bir veritabanı alanı kullanabilirsiniz.

Ben mevcut bir (henüz) yok eğer bana geri "default" avatara düşmek kolay bir yol verir gibi daha ziyade, bizzat) yöntemi (file_exists ile gitmek istiyorum, ve onun basit bir bilge kodu uygulamak. Bu forumu okuma sayfalarında pageload başına gösterilen kullanıcı başına bir kez çalıştırmak olacaktır Ancak, ben, performans endişeleniyorum. Yani bilmek istiyorum, PHP file_exists () fonksiyonu yüksek trafik koşullarında önemli performans isabet neden olacak herhangi bir büyük yavaşlamalar neden olur?

, Eğer büyük değil. Eğer, bir kullanıcı tarafından yüklenen görüntü izleyebilmek için alternatifler üzerinde düşünceniz nedir? Teşekkürler!

PS: Ben görebiliyorum kod farkları sürümleri kontrol dosyası veritabanı doğru ve veritabanı form güvenler kontrol etmek için rahatsız etmez iken dosyaları, konuşma yapmanızı sağlar vardır. (Tabii tarayıcıya iletilir onun sadece url.)

7 Cevap

Yanı sıra diğer posterleri söylediklerini olarak, file_exists (sonucu) otomatik olarak performansını artırmak için PHP tarafından önbelleğe alınır.

Zaten veritabanındaki kullanıcı bilgileri okuyorsanız Ancak, siz de orada bilgileri depolayabilir. Kullanıcının yalnızca bir avatar izin verilirse, sadece (1/0) "avatar vardır" için bir sütun bir tek bit depolamak ve daha sonra dosya adını kullanıcı kimliği olarak aynı olması, ve {[(0 gibi bir şey kullanabilirsiniz )]}

Ayrıca bir BLOB olarak veritabanında gerçek görüntü depolama düşünebiliriz. Yerine kullanıcı tabloya bir sütun olarak takılarak daha kendi tablosunda koy. Bu yedeklemek için forum çok kolay yararı vardır - sadece veritabanı ihracat.

Gerçek performans testi olarak, çok hızlı olması file_exists keşfedeceksiniz. Aynı url "istatistik" olduğunda, php, olduğu gibi 'iki defa, ikinci çağrı sadece php iç istatistik önbellekten çekilir d.

Ve bu sadece php çalışma kapsamında bulunuyor. Hatta çalışmalar arasında, dosya sistemi / os agresif dosya sistemi önbelleğine dosyasını koymak eğiliminde olacaktır, ve dosya yeterince küçük ise, dosya test düz bellek çıkıp var, ancak tüm dosya çok olur olmaz.

İşte benim teoriyi destekleyecek bazı gerçek veri bulunuyor:

Ben sadece bazı performans linux komut satırı yardımcı programları testleri "bulmak" ve "xargs" yapıyordu. Ilerledikçe, ben bir dosya 13000 dosyalar, 100 kez her 30 saniyenin altında, böylece testi var gerçekleştirilen saniyede 43.000 istatistik testleri, çok emin ortalama şu, ince ölçekte onun yavaş eğer senin söylemek karşılaştırarak, zaman o 8 ile 9 bölmek alır, ama bir gerçek dünya senaryoda, kayda değer bir performans sorunu görmek için birkaç kez bir awful çok bu yapıyor olması gerekir.

Eğer 43 thousand, kullanıcıların aynı anda bir saniyenin döneminde, sayfanızı erişen varsa, ben bunu daha bir dosyanın varlığının durumunu kopyalamak için gereken süre çok daha büyük endişeleri var olacak düşünüyorum ortalama senaryo bellek dışında-veya-daha az.

Web sunucusu zaten web sayfasını göstererek sürecinde file_exists () işlemleri (eşdeğer) bir sürü yapıyor olacak, çünkü komut dosyası tarafından bir daha çalıştırmak muhtemelen ölçülebilir bir etkisi olmayacaktır. Web sunucusu belki de en az yapacağız:

  • web kök altdizinlerinin her biri için (varlığını kontrol etmek ve sembolik için)
  • bir web kökünün her alt dizinde bir. htaccess dosyasını denetlemek için
  • senaryonun varlığı için bir

Bu PHP kendisi yapabilir ki onları daha fazla düşünüyor değildir.

file_exists () başına yavaş değil. Asıl mesele performans darboğazları nerede sistem yapılandırılmış ve nasıl olduğunu. Unutmayın, veritabanları çok diskte şeyleri saklamak zorunda, bu yüzden potansiyel disk etkinliği karşı karşıya konum iki şekilde. Öte yandan, her iki veritabanı ve dosya sistemleri genellikle optimize tekrar erişime şeffaf önbelleğe çeşit var.

Şansını performans darboğazı başka olacak çünkü kolayca, her yöne gidebilir. Eğer bir çeşit eğer ben bir seçimdi olmak görebilirsiniz tek yer olurdu satım orada bir disk çekişme bir ton var, ama belki veritabanı erişimi, ayrı bir küme ve daha hızlı (ya da tersi) olduğu barındırma paylaştı.

Biz yararlı istatistikleri üretmek böylece geçmişte ben (onun adı da dahil olmak üzere) bir veritabanında görüntü meta saklanan ettik. Daha da önemlisi, (dosyanın kendisini, sadece metadata) görüntü verilerini bir depolama conducive to change. Ne Gelecekte görüntüyü "onaylama" gerekiyor, yoksa dosyayı silmeden silmek isterseniz?

Kayıt bu kullanıcı için bulunan değilse "default" avatar başı olarak ... iyi, sadece varsayılan birini kullanın.

Her iki şekilde de, file_exists () veya db, endişelenecek bir darboğaz çok olmamalıdır. Bir çözüm, bununla birlikte, daha fazla genişletilebilir.

Performansı tek göz ise, bir file_exists () daha sonra bir veritabanı arama çok daha pahalı olacaktır.

Bütün bu sistem çağrılarını kullanarak sadece bir dizin araması sonra. "File_exists ()" o ve temel sistem çağrıları derece olacak böyle ortak bir operasyon olduğunu, orada yer çok az gerçek I / O ve böylece script ilk çalıştırılmasına sonra Alakalı dizinin çoğu depolama önbelleğe olacak herhangi bir ortak php / os kombinasyonu optimize.

John II belirtildiği gibi. Ekstra işlevsellik ve kullanıcı inteface özellikleri bir öncelik ise, bir veritabanı gitmek için yol olacaktır.

Derin bir kitaplıkta çok repetidly yapılmış, bu yüzden biz gerçekten bulmak için bir profilcisini kullanmak zorunda kaldı - en azından PHP4 ile, ben bir file_exists bir çağrı kesinlikle bizim uygulama öldürmek olduğunu tespit ettik. Çağrı bir düzine kez (çağrı verrry repetidly yapıldı), bazı sayfaların hesaplama arttı kaldırılıyor.

Php5 onlar file_exists önbelleğe mümkün olabilir, ama en azından PHP4 ile bu durumda değildi.

Eğer bir döngü içinde değilseniz Şimdi, belli ki, File_exists büyük bir anlaşma olmayacaktır.