如何取得include檔案的相對url?

edited 十月 2013 in 進階PHP討論
$_SERVER陣列裡取得的都是request script的url,如:
"/~simon/ap1/index.php"

而__FILE__則是include檔案的filesystem路徑,如:
"/home/simon/public_html/ap1/lib/utils.php"

請問要如何取得include檔案的url呢?
(如"/~simon/ap1/lib/utils.php")

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=2375

評論

  • edited 一月 2007
    這個網址透過自訂程序或函式演算應該不會是個難事,一定要系統內建方式的話就沒印象了 :)
  • edited 一月 2007
    include/require 檔案不一定會有 URL ,不是嗎?
    例如我的 URL 根目錄指向 ~/htdocs/ ,但 include 檔案都放在 ~/lib/ (就安全性而言,這是建議做法),那麼就不會有 URL 可以指向 include 檔案。
  • edited 一月 2007
    系統內建是考慮大眾會用到的
    而你要include或考量安全性
    那當然不可能也不應該沿用系統內建

    那可能要問該如何取得相關路徑?
    相對路徑或絕對路徑,都是你可以選擇的方式
    為什麼一定要由系統提供的路徑演算?

    如果已知1加到10是55
    為什麼不放55反而要重算一次1+2+...+10=55?
  • edited 一月 2007
    shirock 寫道:
    include/require 檔案不一定會有 URL ,不是嗎?
    例如我的 URL 根目錄指向 ~/htdocs/ ,但 include 檔案都放在 ~/lib/ (就安全性而言,這是建議做法),那麼就不會有 URL 可以指向 include 檔案。
    喔 我舉的例子造成誤解了
    其實我是把我這個AP主要的業務邏輯集中放在一個檔案裡
    然後讓各個頁面去include以取得AP-specific的常數、變數及函式
    而非跨AP通用的utilities
    所以就放在AP的主目錄而不是放在獨立的lib路徑
    如:/home/simon/public_html/ap1/bizLogic.php
    我現在想做的事就是
    在bizLogic.php裡以一個常數告訴所有引用的頁面
    它們所屬的AP的主目錄的url(/~simon/ap1)
    若不hardcode 我想得到最好的方法就是
    dirname({bizLogic.php自己的url})
    但就是卡在該url取不到
    請問有解否?(沒有說非得是系統內建函式)
    請大大開示 多謝
  • edited 一月 2007
    看不懂你做了哪些動作造成讀不到url
    可以把實踐的程式段落或錯誤訊息貼上來
    這樣大家也比較能理解
  • edited 一月 2007
    sam0228 寫道:
    看不懂你做了哪些動作造成讀不到url
    可以把實踐的程式段落或錯誤訊息貼上來
    這樣大家也比較能理解
    我取不到"/~simon/ap1/bizLogic.php"這個url
    因為user不會直接request這個php檔
    它是用來讓別的php檔(分散在不同子目錄)去require的
    而$_SERVER陣列只能取user直接request的php檔的url
    __FILE__常數又只能取filesystem path
    不知這樣大大看得懂否
  • edited 一月 2007
    老實回答....看不懂=.=

    分段回答
    1.我取不到"/~simon/ap1/bizLogic.php"這個url
    你取不到"/~simon/ap1/bizLogic.php"這個url?
    不能include的話看看是不是權限問題

    2.因為user不會直接request這個php檔
    user不會直接request但是你可以藉由user執行"你的"程式的時候"幫他"request

    3.而$_SERVER陣列只能取user直接request的php檔的url __FILE__常數又只能取filesystem path
    嗯....這段看成純抱怨好了,還是看不懂
  • edited 一月 2007
    sam0228 寫道:
    老實回答....看不懂=.=

    分段回答
    1.我取不到"/~simon/ap1/bizLogic.php"這個url
    你取不到"/~simon/ap1/bizLogic.php"這個url?
    不能include的話看看是不是權限問題

    2.因為user不會直接request這個php檔
    user不會直接request但是你可以藉由user執行"你的"程式的時候"幫他"request

    3.而$_SERVER陣列只能取user直接request的php檔的url __FILE__常數又只能取filesystem path
    嗯....這段看成純抱怨好了,還是看不懂
    您完全誤解我問題的方向了:

    /~simon/ap1/workflow1/page1.php:
    require "../bizLogic.php";
    echo AP_ROOT;

    /~simon/ap1/bizLogic.php:
    define(AP_ROOT, "/~simon/ap1");

    如上,目前AP_ROOT這個常數是hardcoded
    我希望找到不hardcode的方法
    利用偵測bizLogic.php所在的url來自動設AP_ROOT的值
    這樣當AP部署到許多使用單位時 我就不用一個一個改
  • edited 一月 2007
    嗯.....還是不瞭解

    echo dirname(exec("find /~simon/ap1/ -name bizLogic.php"));
    這算哪種?
  • edited 一月 2007
    sam0228 寫道:
    嗯.....還是不瞭解

    echo dirname(exec("find /~simon/ap1/ -name bizLogic.php"));
    這算哪種?
    Oh my god~

    我現在就是不要hardcode「/~simon/ap1/」這串字
    我希望bizLogic.php的程式碼可以找到本身檔案的url
    這樣您瞭嗎?

    您我的對話好像「誰在一壘」這段相聲
  • edited 一月 2007
    總算懂了!!
    目前似乎沒有聽說過類似的功能
  • edited 一月 2007
    說了半天,你想把一段 code 從遠端主機載入本機後執行....

    既然你都想到業務邏輯要切割了,不妨再想想分散式架構運算。你應該這麼想,你要呼叫遠端的一個程式 (function) ,把資料 (參數) 丟給它運算,你只要接收它的回值值 (return value) 即可。為何要把它載入本機執行?
    當你把業務邏輯以遠端程式(或者說網頁)的形式實踐時,你要的 URL 就指向這個遠端程式。其實你也就完成一個 web service 的實作了。
  • edited 一月 2007
    shirock 寫道:
    說了半天,你想把一段 code 從遠端主機載入本機後執行....

    既然你都想到業務邏輯要切割了,不妨再想想分散式架構運算。你應該這麼想,你要呼叫遠端的一個程式 (function) ,把資料 (參數) 丟給它運算,你只要接收它的回值值 (return value) 即可。為何要把它載入本機執行?
    當你把業務邏輯以遠端程式(或者說網頁)的形式實踐時,你要的 URL 就指向這個遠端程式。其實你也就完成一個 web service 的實作了。
    並沒有要載入遠端code...

    我的表達能力實在太差了 一直讓人誤解我的意思... orz

    放棄了,就給它hardcode唄
    感謝大大嘗試要幫助我~
  • edited 一月 2007
    建議動態加入 include 路徑

    set_include_path( );
    加上 dirname(__FILE__) 這個值可以很動態的處理 include 檔路徑問題。
  • edited 一月 2007
    使用 set_include_path( )
    記得用 . PATH_SEPARATOR . get_include_path()
    在最後把原本的路徑補回來。
Sign In or Register to comment.