2009-08-08 63 views
0

我在〜/ Dropbox/db /開發我的項目。我需要將該文件夾連續移動到/ var/www,以便能夠在Firefox中查看結果,因爲它是唯一擁有Apache的地方。爲了開發PHP開發的類似LaTeX的PATH系統

我的文件樹是在〜/ Dropbox的/ DB/

. 
|-- handlers 
| |-- login.php 
| |-- question.php 
| |-- question_answer.php 
| `-- register.php 
|-- index.php 
|-- forms 
| |-- login.php 
| |-- question.php 
| |-- question_answer.php 
| `-- register.php 

我有實例的文件在以下參考〜/ Dropbox的/ DB /表格/ login.php中:

include '../handlers/login.php'; 

這很糟糕,因爲所有事情都會在一段時間後破裂。例如,我在index.php啓動Firefox。這意味着所有的PATHS都與index.php相關。這使得上面的命令毫無意義。

也許,這個問題唯一的解決辦法就是讓所有路徑在我的所有文件絕對的。 我試圖避免這種情況,因爲這會迫使我使用SED的替換命令。

我想有一個類似LaTeX的\graphicspath的命令,用於窗體和處理程序,這樣我就可以簡單地說在哪裏可以找到給定的文件在一個文件中。我發現PHP有以下功能,需要在index.php開頭。但是,這似乎還不夠,因爲我無法將其擴展到形式和處理程序。

$path_parts = pathinfo('/var/www/index.php'); 

你怎麼能有一個類似LaTeX的PHP路徑系統?

回答

4

如果你總是希望你的包括對相對於目前國內當前執行的文件駐留在該文件夾,您可以使用以下命令:

include(dirname(__FILE__) . '/../hello.php'); 

所以,如果代碼是在x.php,你包括y.phpx.php,它不會在哪個目錄沒關係y.php是因爲包含總是relati到目錄x.php是在。

我個人認爲這是最實現你想要的最省力的方式。您不需要任何特殊的配置或設置,並且所有路徑都是「相對的」。

PHP Documentation

__FILE__:文件的完整路徑和文件名。如果在包含內使用,則返回包含文件的填充路徑和文件名。

1

我不知道到底乳膠做什麼,但是我不知道爲什麼你描述的錯誤發生,或者是你認爲會發生這種情況? 當你指向的Firefox的index.php的index.php中所有的路徑將是相對的index.php然而,在所有的login.php的路徑將(應該)是相對的login.php,即使login.php中被索引中。 PHP。另外一種不需要做這種事情的方法是使用一個變量來存儲基本路徑。但是對於你的佈局來說這不太合適。

在另一方面我有一個解決方案,您的移動文件的問題,只需要重新配置Apache 對我來說是在/ etc/apache2的/站點啓用文件需要編輯/ 000-默認 你需要做的

sudo gedit /etc/apache2/sites-enabled/000-default 

並輸入您的密碼。 將路徑更改爲Dropbox/db目錄的完整路徑

它最終應該是這樣的,用您的用戶名替換USERNAME。

<VirtualHost *:80> 
    ServerAdmin [email protected] 

    DocumentRoot /home/USERNAME/Dropbox/db 
    <Directory /> 
     Options FollowSymLinks 
     AllowOverride None 
    </Directory> 
    <Directory /home/USERNAME/Dropbox/db/> 
     Options Indexes FollowSymLinks MultiViews 
     AllowOverride None 
     Order deny,allow 
     deny from all 
     allow from 127.0.0.1 
    </Directory> 

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ 
    <Directory "/usr/lib/cgi-bin"> 
     AllowOverride None 
     Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch 
     Order allow,deny 
     Allow from all 
    </Directory> 

    ErrorLog /var/log/apache2/error.log 

    # Possible values include: debug, info, notice, warn, error, crit, 
    # alert, emerg. 
    LogLevel warn 

    CustomLog /var/log/apache2/access.log combined 

    Alias /doc/ "/usr/share/doc/" 
    <Directory "/usr/share/doc/"> 
     Options Indexes MultiViews FollowSymLinks 
     AllowOverride None 
     Order deny,allow 
     Deny from all 
     Allow from 127.0.0.0/255.0.0.0 ::1/128 
    </Directory> 

</VirtualHost> 

那麼你不會有四處移動文件。

+0

**您應該運行哪個命令來查看Apache文件中的更新? - 文件更改後的URL是什麼?**如果我們在/ home/masi/Dropbox/db/index.php文件夾中有index.php,它是'localhost/index.php'嗎? – 2009-08-08 13:28:08

+0

在我的配置上面有一個錯誤,特別是DocumentRoot/home/USERNAME/Dropbox/db 我已經編輯它做檢查。 (在DocumentRoot/home/USERNAMEDropbox/db之前)應該像現在一樣。 命令是sudo /etc/init.d/apache2 restart或者如果這樣做不起作用,那麼sudo /etc/init.d/apache2停止跟着sudo /etc/init.d/apache2 start 所有的URL都會保留相同,是的,它將是本地主機/ index.php – user152247 2009-08-08 20:03:41

1

一個好的解決辦法是讓你的整個程序運行從一個文件,通常的index.php。在這種情況下,你會做的是接受一個GET參數,告訴你要做什麼動作。這將使它可以包含與index.php相關的文件。

例如:?的index.php動作=登錄或動作的index.php =註冊。

這也使得唯一的網址,以便正常瀏覽行爲被保留。

雖然這在forst中可能看起來有些不尋常,但有一些PHP程序以這種方式運行(例如DrupalSymfony),並且它工作得很好。

+0

你可以舉一個例子如何使用GET參數,例如,請給文件'handler_login.php'。目前我在我的表格中使用POST方法。 - **如何用POST方法實現與GET相同的結果?** – 2009-08-08 13:13:31

2

方法1

include_path你在找什麼?您可以設置它要麼在php.ini,或者你的Apache虛擬主機:

<VirtualHost *:80> 
    ... 
    php_value include_path ".:/usr/share/php:/usr/share/pear:/usr/local/share/php" 
    ... 
</VirtualHost> 

不太一樣好Kpathsea在(什麼Τεχ使用),但接近你可以得到的。我更喜歡這種方法,因爲它可以很容易地將包含文件保存在文檔根目錄之外(因此您不必擔心有人直接執行它們)。

方法2

可以使用$_SERVER['DOCUMENT_ROOT']您的文檔根得到。所以你可以用它來寫一個完整的包含路徑。

+0

您的意思是我應該有'php_value include_path'。:/ home/masi/Dropbox/db /:「'能夠當我在'/ home/masi/Dropbox/db/index.php'有index.php時,通過'localhost/index.php'在Firefox中查看我的php -file? – 2009-08-08 13:33:00

+0

當您設置include_path時,您正在給PHP查找包含文件的位置列表。如果你將它設置爲'/ home/masi/Dropbox/db /',並且你包含(「foo.php」)',那麼PHP會查找'/ home/masi/Dropbox/db/foo.php' 。如果你有多個目錄設置(':'-separated),那麼它將按順序搜索每個目錄。 – derobert 2009-08-10 18:24:06

2

另一種方法是創建一個symbolink鏈接在/ var/WWW /〜/ Dropbox的/ DB/ (不要忘記設置htaccesss跟隨符號連接)