2012-03-16 12 views
7

Bu ikisinin dahil benim web klasöründe birkaç dosya vardır:PHP'de sembolik bir bağlantının orijinal yolunu nasıl edinebilirim?

  • /mydocroot/include/somesubdir/include.inc.php
  • /mydocroot/include/settings.inc.php

somesubdir, diskimdeki başka bir dizinin sembolik bir bağlantısıdır, eh, yani /anywhere/else diyelim.

include.inc.phpiçinde, böyle bir şey yazılır: Bence

<?php 

require_once "../settings.inc.php"; 

?> 

, /mydocroot/include/settings.php dahil ... Ama tahmin gerektiğini Ne olur? PHP,/mydocroot/include/settings.inc.php yerine /anywhere/settings.inc.php, 'u dahil etmeye çalışır.

PHP, sembolik bağları otomatik olarak çözüyor gibi görünüyor.

Bunu nasıl önleyebilirim ve settings.inc.php dosyamı ekleyebilir miyim?

+0

'echo __DIR __;' inside '/ include.inc.php' nedir? –

+0

@Rocket: 'echo __DIR __;' yazdırır/her yerde/başka '. –

cevap

2

En düz ileri çözüm, her zaman mutlak yollar kullanmaktır. Bunu yapabilmeniz için birden çok yolunuz vardır, ihtiyaç duyduğunuz her seferde yolu kodlamaktan, komut dosyasının üst kısmına bir kez kod yazmak ve bunu referans alarak, bunu dinamik olarak çözmek ve bir kez senaryo.

Üçüncü seçenek, CMS'lerin çoğunun dosya yapınızı tam olarak bilmeden çalışabilmesi için kullandığı en büyük seçenektir.

Neden bu şekilde sembolik olarak bağlantılı bir dizin kullanıyorsunuz?

+0

Daha önce @adam; Ben aslında sembolik bir bağlantı kullanıyorum çünkü sabit diskimde aynı dosyanın birden çok sürümüne sahip olmak istemiyorum. Paylaşılan kod. –

+0

Yeterince adil, bu yüzden sordum. Cevabımı hala kullanabilirsin. Sadece /mydocroot/include/somesubdir/include.inc.php ->/anywhere/else/include.inc.php ''i eklemeden önce ayarlayın ya da ilk olarak ayarlayın. Belki de ideal değil, ama söyleyebileceğim kadarıyla var. – Jason

+1

Başarılabilmesinin tek yolu gibi görünüyor. Bu, geçici çözümü yarattığım yoldur: bir dosya (** symlink.php **) **/mydocroot/include/** içerisine tek bir deyim oluşturdum: 'define (" ROOT ", __DIR__) '' Ardından ** include.inc.php ** 'ROOT' sabitinin tanımlanmış olup olmadığını kontrol ederim. Evet ise, o yolu kullanın. –

0

Bir dosyanın sembolik bir bağlantı olup olmadığını kontrol etmek için is_link'u kullanabilirsiniz. Öyleyse, mutlak hedefi almak için readlink kullanın.

Ancak, php gelişiminden on yıl sonra, sembolik bağların kullanılmasına neden olmamıştım. Jason'ın önerdiği gibi, her zaman mutlak bir yolu tanımladım ya da çıkardım, sonra tüm dosya yollarını mutlak hale getirmek için uygulamamda bunu kullandım.

+2

Sorun şu ki, geriye doğru çalışmayacak, yapmaya çalıştığı şekilde. Esasen, bağlantılı dizindeki dosya, içerdiği dizinin, doğrudan dosya sistemi aracılığıyla değil, bağlantılı bir bağlamda erişildiğini belirlemenin bir yolu yoktur. Sembolik bağlar kullanıldığında, sınırlı bağlamlarda anlam ifade edebilir. OP bağlamında mantıklı olan tek yol, dosyanın birden çok sanal ana bilgisayar arasında paylaşılmasıdır. – Jason

3

Benzer bir sorunla karşılaştım. İstenen dosyayı görüntüleyen $_SERVER['SCRIPT_FILENAME'] değişkenini kullanarak bunu yapabilirsiniz, böylece sembolik bir bağlantı olsa bile sizin durumunuzda /mydocroot/include/somesubdir/include.inc.php olacaktır. yerine

require_once "../settings.inc.php"; 

bunu yapmanın bir seviye düşük bir dosya eklemek için:

require_once dirname(dirname($_SERVER['SCRIPT_FILENAME'])).DIRECTORY_SEPARATOR."settings.inc.php" 

Documentation about $_SERVER variables

1

çözüm BasePath değişkeni oluşturmaktır.Bunu yapmanın en iyi yolu, vb Dolayısıyla, komut üstündeki aşağıdakileri içerir ve sonra senin içerir o

$basepath = dirname(dirname($_SERVER['SCRIPT_FILENAME'])).DIRECTORY_SEPARATOR; 

Ardından BasePath başvurabilir başvurmak olduğunu gerektirir

include "../myscript.php"; 

:

geri ileri geçiyor ise

include $basepath."myscript.php"; 

, bu olacak haline misiniz dir_name fonksiyonları iki kez

haline misiniz, Sen yuva gerekir

include $basepath."../myscript.php"; 

, artı aracılığıyla backtick gereken her ek klasör için bir kez daha. Sembolik bağın bulunduğu klasöre geri dönmelisiniz.

Bu sorunun PHP ile büyük bir tasarım hatası olduğunu düşünüyorum. Gerçek dosyaya göre backticked dosyalarına erişimin istenebileceği tek bir örnek düşünemiyorum. Sanal barındırma da dahil olmak üzere tüm durumlarda, SADECE bağlantılı yol boyunca geri hiçbir zaman hedef yoldan geri dönmek mantıklıdır.

İlgili konular