Performans php autoload kullanarak ve sınıf dosya ararken acı misiniz?

7 Cevap php

Ben her zaman en iyi benim php koduna sınıfları dahil etmek nasıl mücadele ettik. Pathing genellikle bir konudur ama bir kaç dakika önce i önemli ölçüde yardımcı olur, hangi this question bulundu. Şimdi autoload __ ve çok daha kolay benim uygulamaları geliştirme işlemi yapmak düşünerek okuyorum. Sorun i lib / genel klasörü içine her şeyi atma aksine işlevselliği ayrı alanlarda klasör yapısını korumak gibi değildir. I tüm alt klasörler dahil bir sınıf klasörün derin bir arama yapmak autoload geçersiz Yani, ben ne performans isabet bekleyebilirsiniz?

Açıkçası bu sınıfların klasör yapısı ve sayısı ölçeği, derinliğine bağlıdır, ancak bu sorunlara neden olur genelde ben orta ölçekli bir proje üzerinde soruyorum.

7 Cevap

__autoload harika ama bir özyinelemeli arama fonksiyonu tüm dosyaları belirten maliyeti pahalıdır. Sen autoloading için kullanılacak dosyaların bir ağaç bina bakmak isteyebilirsiniz. Benim çerçevede, ben sürekli kendi sınıfları için dosyaları isim ve veri için önbelleğe alınmış bir haritayı kullanabilirsiniz.

Çıkış http://trac.framewerk.org/cgi-bin/trac.fcgi/browser/trunk/index.php [dead link] Bu nasıl yapılabilir bir fikir doğrultusunda 68 başlayan.

Edit: Ve daha doğrudan önbelleğe alma olmadan, ağır trafik ortamı ile bir sitede bir performans isabet bekleyebilirsiniz, sorunuza cevap vermek.

Bir ortak model (Armut, örnek olarak Zend Framework ...) Db_Adapter_Mysql dahil-yoluna eklenen bir yere gelen, Db / Adaptör / mysql.php / adresinde olacak şekilde classname, yolunu yansıtmak yapmaktır.

Onları bulmak için nerede yapısını tanımlamak olacak böylece kolayca, her şeyden önce, bu do sınıfları sayabilirim 2 yolu vardır

function __autoload($classname)
{
	try
	{
		if (class_exists($classname, false) OR interface_exists($classname, false))
		{
			return;
		}

		$class = split('_', strtolower(strval($classname)));

		if (array_shift($class) != 'majyk')
		{
			throw new Exception('Autoloader tried to load a class that does not belong to us ( ' . $classname . ' )');
		}

		switch (count($class))
		{
			case 1: // Core Class - matches Majyk_Foo - include /core/class_foo.php
				$file = MAJYK_DIR . 'core/class_' . $class[0] . '.php';
			break;

			case 2: // Subclass - matches Majyk_Foo_Bar - includes /foo/class_bar.php
				$file = MAJYK_DIR . $class[0] . '/class_' . $class[1] . '.php';
			break;

			default:
				throw new Exception('Unknown Class Name ( ' . $classname .' )');
				return false;
		}

		if (file_exists($file))
		{
			require_once($file);

			if (!class_exists($classname, false) AND !interface_exists($classname, false))
			{
				throw new Exception('Class cannot be found ( ' . $classname . ' )');
			}
		}
		else
		{
			throw new Exception('Class File Cannot be found ( ' . str_replace(MAJYK_DIR, '', $file) . ' )');
		}

	}
	catch (Exception $e)
	{
		// spl_autoload($classname);
		echo $e->getMessage();
	}

}

Ya da, 2, çok autoloaders kullanın. PHP> = 5.1.2 Birden autoloaders eklemenizi sağlar SPL kütüphane, Has. Her yol için bir tane ekleyin, ve yolumu onu bulacaksınız. Ya da sadece dahil yoluna eklemek ve varsayılan spl_autoload kullanın ()

Bir örnek

function autoload_foo($classname)
{
	require_once('foo/' . $classname . '.php');
}

function autoload_bar($classname)
{
	require_once('bar/' . $classname . '.php');
}

spl_autoload_register('autoload_foo');
spl_autoload_register('autoload_bar');
spl_autoload_register('spl_autoload'); // Default SPL Autoloader

Autoload is great PHP feature that helps you very much... The perfomance wouldn't suffer if will use the smart taxonomy like: 1. every library stays in the folders "packages" 2. every class is located by replacing the "_" in the class name with the "/" and adding a ".php" at the end class = My_App_Smart_Object file = packages/My/App/Smart/Object.php

(Hemen hemen her çerçevesi tarafından kullanılan) bu yaklaşımın yararları :-) ayrıca kod akıllı organizasyon

Her yerde dosyalar için Avcılık (çok fazla disk hit) şeyler yavaş yapacaktır. Durumda bunları gerekebilir kendi sınıflarının tüm yüklüyor şey daha fazla bellek almak yapacak. Her dosyada ihtiyaç sınıfları (onlar artık kullanılan iseniz yani kaldırıldı alamadım) korumak zordur Belirleme.

Asıl soru sizin için daha önemli olan bu hangisi? Onlar sonunda, tüm makasına konum, bu yüzden bir tane almak zorunda. Bu ikinci ve üçüncü seçenekleri yükü çoğu aslında kod derleme ile ilgisi olsa da, tartışılabilir. APC anlamlı yükleme yükünü azaltabilir gibi bir şey kullanarak ve her sayfa yük her sınıf derleme.

APC kullanımı göz önüne alındığında, ben büyük olasılıkla modülleri (örn. web arayüzü modülü, veritabanı etkileşim modülü, vb) içine benim kodunu bölünmesi yaklaşım ve bu modüllerin her biri kendi modül için tüm sınıfları içe, artı olurdu sınıfları diğer modüller de gerekebilir. Bu son ikisi arasında bir değiş tokuş, ve bunu benim ihtiyaçları için yeterince iyi çalışıyor bulduk.

Ben __ özdevinimli_yükle () kendisi özyinelemeli arama yapar, basit bir komut dosyası kullanarak yeniden bir dosyada bulunan göreli yolları, bir karma eşleme sınıf isimlerini danışır basit bir yaklaşım kullanma eğiliminde.

Bu yeni bir sınıf dosyası ekleyerek veya kod tabanını yeniden zaman komut dosyası çalıştırmak gerekir, ama aynı zamanda () çağırır gereksiz stat yol açabilir) (__ autoload in "akıllılık" önler ve kolayca taşıyabilirsiniz avantajı vardır Yapmam gereken tüm autoloader güncellemek için tek bir komut dosyası çalıştırmak olduğunu bilerek, benim kod tabanı etrafında içinde dosyaları.

Script kendisi, özyinelemeli benim / dizin içerir inceler ve istisnalar kısa listesinde adı olmayan herhangi bir PHP dosyası (autoloader kendisi, artı diğer bazı standart dosyalar ben sahip olma eğilimi) varsayar aynı isimde bir sınıf içerir.

Zend Framework yaklaşımı PEAR klasörü standart (Class_Foo haritaları / Sınıf / foo.php), ancak ziyade include_path kullanan bir dizi temel yolu kullanmaya dayalı autoload yapmaktır.

Kendi yaklaşımı ile sorun bir dosya yani özdevinimli_yükle dışarı hata, include_path ait herhangi bulunmayan bir dosyayı eklemeyi deneyin ve spl_autoload_register a kayıtlı başka özdevinimli_yükle işlevleri vermek asla varsa önceden kontrol etmenin bir yolu var olduğunu dosya eklemek için bir şans.

Yani hafif bir sapma elle özdevinimli_yükle PEAR moda ve taban yolları üzerinde sadece bir döngü içinde sınıflar kurulum bulmak için bekleyebilirsiniz taban yolları bir dizi sağlamaktır:

<?php
//...
foreach( $paths as $path )
{
    if( file_exists($path . $classNameToFilePath) )
        include $path . $classNameToFilePath;
}
//...
?>

Eğer biraz ama her autoload için sadece n kontrol ediyoruz taban yollarının sayısı kötü n aramalar, yapıyor olacağım aramak olacak Verilen.

Ama kendini yine özyinelemeli dizinleri soruyu taramak zorunda bulursanız "özdevinimli_yükle benim performansımı zarar Will," değil soru "neden ben rastgele bir yapısı etrafında benim sınıf dosyaları savurma ben?" Olmalı PEAR yapısına tutunan bu kadar çok baş ağrısı kurtaracak, ve el autoload karşı olarak içerir yapıyor gitmeye karar bile, sizin ifadeleri içerir yaptığınızda sınıf dosyalarının bulunduğu gibi hiçbir tahmin olacaktır.