2013-03-07 46 views
4

考慮到與以下結構的PHP應用程序:如何以兼容的方式將PHP文件包含在Phar和Phar中進行打包?

/ 
    lib/ 
     mylib.php 
    web/ 
     index.php // includes "mylib.php" with: require_once __DIR__ . "/../lib/mylib.php" 

我試圖在同一時間以相同的源代碼庫涵蓋以下情況:

  1. 沒有的Phar:能使用該應用程序,DocumentRoot指向web/並將所有請求重定向到index.php
  2. 最小的Phar:能夠產生一個只包含網/ index.php文件這將被保存爲藥業:網絡/應用minimal.phar
  3. 完整的Phar:能產生既包含的lib目錄和網/ index.php文件這將被保存爲的內容藥業:網絡/應用full.phar

對於phar文件,所有請求都會被重定向到phar文件本身。

是否有可能實現所有這些用例而不必更改* require_once *?

我嘗試不同的方法(相對/絕對),包括的lib/mylib.php從*網絡/ index.php文件」,以及嘗試一些技巧與的Phar ::安裝()。沒有我嘗試成功

回答

1

簡單地依靠include路徑

不要做:。

require_once __DIR__ . "/../lib/mylib.php"; 

但:

require_once "mylib.php"; 

,並設置包括在腳本的開頭路徑:

set_include_path(__DIR__ . '/../lib/' . PATH_SEPARATOR . get_include_path()); 
+0

,將肯定有幾個原因無法正常工作:1。 通過set_include_path()從內部藥業將導致相同問題,'''__DIR__'''爲''''phar://.../path/to/phar「'''而庫不在PHAR文件中。 2.庫通常在目錄中包含大量不同的文件,你不能簡單地添加每個目錄,這將非常緩慢(路徑中的所有條目將被掃描以找到該文件),並且不起作用:例如。 'Symfony/Component/Config/Loader/Loader.php'''''Symfony/Component/Templating/Loader/Loader.php'''包括'''Loaded.php''',真的嗎? – 2013-03-11 11:05:07

+0

我說的是PSR-0兼容自動加載,當然你應該設置不同的包含路徑,具體取決於你是否在phar中。 – cweiske 2013-03-11 11:22:40