Programlı PHP belge kök nasıl belirlenir?

6 Cevap php

Bir host bir yanlış apache - İşte ben son zamanlarda içine çalışan oldum bir sorun. Bu demektir ki, $_SERVER['DOCUMENT_ROOT'] tatilinde güvenen tüm komut. Ben buldum kolay çözüm, sadece paylaşılan bazı küresel içeren dosyaları değişkeni ayarlamak, ama bunu unutmak için değil bir ağrı olduğunu. Benim soru nasıl programlama doğru belge kök belirler, nedir?

Örneğin, bir ana bilgisayarda, kurulum bu gibi:

$_SERVER['DOCUMENT_ROOT'] == '/htdocs'

Gerçek belge kökleri vardır:

test.example.com -> /data/htdocs/example.com/test
www.example.com -> /data/htdocs/example.com/www

Ve ben (yolda /data/htdocs/example.com/www/blog) /data/htdocs/example.com/www doğru değerini elde etmek için www.example.com/blog/ adlı çalıştırılan bir komut dosyası istiyorum.

Başka bir host, kurulum biraz farklı:

$_SERVER['DOCUMENT_ROOT'] == '/srv'
test.example.com -> /home/virtual_web/example.com/public_html/test
www.example.com -> /home/virtual_web/example.com/public_html/www

Bu herhangi bir çözüm var mı? Ya da tek yolu sadece hiç $_SERVER['DOCUMENT_ROOT'] güveniyor ve benim sitelerde koşuyorum tüm yazılım düzeltmek için değil mi? Hosting tarafında bu Tespit ben bu doğru yapılandırılmış bir host karşılaşmaya henüz ettik, bir seçenek görünmüyor. I got en azından open_basedir'dan içinde oldu www.example.com için bir belge kök işaretleme, - onlar www.example.com /u2/www/example_com/data/www/ işaret olurdu başka bir adlandırma düzeni kullanılır.

6 Cevap

Dayanarak http://www.helicron.net/php/:

$localpath=getenv("SCRIPT_NAME");
$absolutepath=getenv("SCRIPT_FILENAME");
$_SERVER['DOCUMENT_ROOT']=substr($absolutepath,0,strpos($absolutepath,$localpath));     

Ben benim ana bilgisayarda boş bir dize döndürdü çünkü basename / realpath hile değiştirmek zorunda kaldı. Bunun yerine, ben kullanmak SCRIPT_FILENAME. Bu muhtemelen artık IIS üzerinde çalışmak olmaz (ama $ _SERVER değişkeni kullanılan orijinal komut muhtemelen ya olmaz).

PHP5'ta göründüğü dosyasının mutlak yolunu içeren sihirli sabit __FILE__ var. Sen belge kökünü hesaplamak için dirname ile birlikte kullanabilirsiniz.

Sen bir config dosyasına aşağıdaki gibi bir açıklama koyabilirsiniz

define ('DOCUMENT_ROOT', dirname(__FILE__));

Bu hile yapmak gerekir

Bu insanlar index.php htaccess ve / veya sorgu dizeleri kullanılarak bir bootstrap / aracılığıyla her şeyi sifon bir nedeni de budur. Sen dirname( __FILE__ ) Yukarıda belirtildiği kandırmak ve app kamu tabanı olsun bu şekilde kullanabilirsiniz.

Eğer tek bir giriş noktası geçmek için çok fazla içine iseniz, insanlar mutlaka gördüğüm bir şey baz dir benzersiz bir dosyayı bulmak için dizin ağaca yürür kendi komut dosyası için ortak bir başlık var ise:

function findAppBase( $dir ) {
    if( file_exists( "$dir/unique_file.txt" ) ) {
        return $dir;

    return findAppBase( dirname( $dir ) );
}

$base = findAppBase( dirname( __FILE__ ) );

Bu kod test edilmemiştir, ve $_ENV içinde değişkenler veya $_SERVER istediğini yapacak kullanarak bir yağmurluk yolu olabilir ...

PHP should komut yüzden sürece size kullanarak belge kökünü anlamaya muktedir olmalıdır kırık değil gibi, olan birine geçerli dizini ayarı olacak $_SERVER['SCRIPT_FILENAME'] ve {[( 2)]}. (Ben daha yararlı) (phpinfo şey olabilir, her $ _SERVER kafamın üst kapalı vars hatırlayamıyorum.)

Neden host doğru yaptığı sunucularını yapılandırır talep değil?

bu tür şeyler birileri nihayet sunucu giderir kadar kod sessizce dinlenmeye ve kaldırıldı (ama hala aktif) asla eğilimindedir. Sonra her şey tekrar kıracak.

Veya, çalışacak bir ana için malzeme taşımak. Bu kırılırsa, kimin yanında bulacaksınız ne bilir.