2010-03-13 12 views
8

Bu çok garip, henüz bir sonuçla özetleyen var mı?PHP hangi dizinleri include() ile göreceli bir yol eklerken kontrol eder?

Bazen, dahil edilen dosyanın dizinini de denetler.

Ancak bazen değil.

D: \ test \ 1.php

<?php 

include('sub\2.php'); 

D: 3.php2.php aynı dir olan \ test \ 2.PHP

<?php 

include('3.php'); 

.

yukarıdaki eser, ama neden? Geçerli dizin D:\test olmalı, ama yine de D:\test\sub

Daha hikaye (son) bir Hakkında

olduğu 3.php bulabilirsiniz yıl önce bu sorunu tanıştım, sonra sona erdi aşağıda gibi gömmek ile düzelttim:

common.php:

if (file_exists("../../../Common/PHP/Config.inc")) 
    include('../../../Common/PHP/Config.inc'); 

if (file_exists("../../Common/PHP/Config.inc")) 
    include('../../Common/PHP/Config.inc'); 

if (file_exists("../Common/PHP/Config.inc")) 
    include('../Common/PHP/Config.inc'); 

if (file_exists("Common/PHP/Config.inc")) 
    include('Common/PHP/Config.inc'); 

Nerede Config.incCommon.php

+1

İyi soru! Bunu Windows ve Linux'ta onaylayabilirim. Bunun neden olduğu hakkında hiçbir fikrim yok. –

+0

Son örneğinizle ilgili olarak, "Config.inc", "Common.php" ile aynı dizinde bulunuyorsa, bu, 'include (dirname (__ FILE __).'/Config.inc '); - her zaman için basitleştirilebilir. "include_path" ve "Common.php" dosyasına hangi dosyadan dahil olursa olsun. "Include_path" içinde (mevcut dizinin genellikle dahil edildiği) "Config.inc" bulunamazsa, o zaman 'Config.inc' ibaresini dahil edebilirsiniz. include_path ilk aranır (başarısız olur). – MrWhite

+0

İlk örneğinizde, "D: \ test \ 2.php" "D: \ test \ sub \ 2.php" olmalıdır. (Aksi takdirde 'include ('sub \ 2.php');' asla işe yaramaz.) – MrWhite

cevap

1

Mevcut yolunda denetler aynı dizinde olduğunu ve dizinleri include_path listelenen.

Dahil etme yolunuzu görmek için phpinfo() çalıştırabilirsiniz.

+0

Bu, anlattığım problemi açıklamıyor :( – user198729

+0

@user bildiğim kadarıyla, hepsi bu.Lütfen dosyaların ne zaman yükleneceğini ve ne zaman alınmadığını gösteren örnekleri gösterin. –

+0

'getcwd()', istekte açıkça değiştirmezsek ('chdir()' gibi) bir istekte değişiklik yapar. Yakında bir örnek vereceğim. – user198729

1

Bazen ana/fopen_wrappers.c içinde php için kaynak koduna bakmak değilse
Güncel dizin getcwd()

+0

Hey, sorumu güncelledim, bir göz at :) – user198729

2

ile kontrol edilebilir bazen current working directory ve olmanın dahil dosyanın dizin

bulacaksınız
/* check in calling scripts' current working directory as a fall back case 
    */ 
    if (zend_is_executing(TSRMLS_C)) { 
     char *exec_fname = zend_get_executed_filename(TSRMLS_C); 
     int exec_fname_length = strlen(exec_fname); 

     while ((--exec_fname_length >= 0) && !IS_SLASH(exec_fname[exec_fname_length])); 
     if (exec_fname && exec_fname[0] != '[' && 
      exec_fname_length > 0 && 
      exec_fname_length + 1 + filename_length + 1 < MAXPATHLEN) { 
      memcpy(trypath, exec_fname, exec_fname_length + 1); 
      memcpy(trypath+exec_fname_length + 1, filename, filename_length+1); 
      actual_path = trypath; 

Bu, koşulsuz olarak yürütülüyor gibi görünüyor ve bu nedenle her zaman include_path'de belirtilen tüm olasılıklardan sonra son seçenek olarak, dahil/dosya açma komut dosyasıyla aynı yolda bir dosya hazırlayacaktır. Ve yalnızca, include() öğesinde göreli veya mutlak bir yol tanımlamazsanız.

+0

Bu kodu anlayamıyorum, bazen içerilen dosyanın dizinini kontrol etmeyen bazı ipuçları var mı? – user198729

+0

'3.php' için ilk önce \ _path içerisindeki tüm konumları sınar. Burada verilen göreceli bir yol, örn. 'include_path =.; ..; lalala 'mevcut çalışma dizinine göre (bir include()) değişmez. Sadece son (ek) seçeneği dahil dosya ile aynı dizine bakmaktır. Bu, bulabileceği ilk '3.php'yi alır. Bu senin sorunun mu: php beklediğiniz gibi başka bir 3.php kapar? Diğer sorularınız ... – VolkerK

+0

Benim sorun bazen 3.php bulamaz, ancak kolayca çoğaltamam.Ama dahil dosya ile aynı dizinde var.Maybe include' bir işlev/yöntem, sanırım ... – user198729

İlgili konular