2010-09-28 70 views
0

我正在研究一個PHP項目,其中有很多硬編碼路徑。我不是主要的開發人員,只是在項目的一小部分工作。將從(* nix)服務器到PHP的路徑轉換爲(winxp)開發機器

我希望能夠在提交它們之前在本地測試我的更改,但是我的目錄結構完全不同。例如,代碼中有很多這樣的內容:

require_once("/home/clientx/htdocs/include.php") 

這對我的本地WAMP服務器不起作用,因爲路徑不同。有沒有辦法告訴WAMP或XP「/ home/clientx/htdocs /」真的意味着「c:/ shared/clients/clientx」?

回答

1

始終使用$_SERVER['DOCUMENT_ROOT']而不是硬編碼路徑。

require_once($_SERVER['DOCUMENT_ROOT']."/include.php") 

至於你的wamb環境,你需要一個專用的驅動來模擬文件結構。您可以使用NTFS工具或簡單的subst命令將某個目錄映射到驅動器。
在此驅動器上創建/home/clientx/htdocs/文件夾並更改您的httpd.conf以反映它。

但同樣,你會做你自己,說服你的同事停止使用硬編碼路徑

+0

在這種情況下,對主代碼的更改不是一種選擇 - 我是一個承包商,負責代碼的公司也是如此。我與客戶端有「政治資本」,我可以用它來強制更改,但我只會將其用於諸如安全漏洞之類的重要事情。 – justkevin 2010-09-28 15:37:27

1

如果它是一個本地副本,做一個搜索和整個目錄更換,請不要忘記斜線一個大忙。而當您提交代碼時,請做相反的處理。 這是解決方案,如果你不想添加額外的變量和東西(因爲這會改變其他開發者的代碼/工作/依賴關係(如果有的話)

搜索「/ home/clientx/htdocs /」和更換到這一點:「C:/共享/客戶/ clientx /」

0

警告:僅使用此解決方案緊急搶修,NEVER較長的生產代碼

定義與重寫方法的類,看到http://php.net/manual/en/class.streamwrapper.php

<?php 
class YourEmergencyWrapper { 
    static $from = '/home/clientx/htdocs/'; 
    static $to = 'c:/shared/clients/client'; 
    private $resource = null; 
    //...some example stream_* functions, be sure to implement them all 
    function stream_open($path,$mode,$options=null,&$opened_path){ 
     $path = self::rewrite($path); 
     self::restore(); 
     $this->resource = fopen($path,$mode,$options); 
     self::reenable(); 
     $opened_path = $path; 
     return is_resource($this->resource); 
    } 
    function stream_read($count){ 
     self::restore(); 
     $ret = fread($this->resource,$count); 
     self::reenable(); 
     return $ret; 
    } 
    function stream_eof(){ 
     self::restore(); 
     $ret = feof($this->resource); 
     self::reenable(); 
     return $ret; 
    } 
    function stream_stat(){ 
     self::restore(); 
     $ret = fstat($this->resource); 
     self::reenable(); 
     return $ret; 
    } 
    static function rewrite($path){ 
     if(strpos($path,self::$from)===0) $path = self::$to.substr($path,strlen(self::$from)); 
     return $path; 
    } 
    //... other functions 
    private static function restore(){ 
     stream_wrapper_restore('file'); 
    } 
    private static function reenable(){ 
     stream_wrapper_unregister('file'); 
     stream_wrapper_register('file',__CLASS__); 
    } 
} 
stream_wrapper_unregister('file'); 
stream_wrapper_register('file','YourEmergencyWrapper'); 

嚴重的是,只在你自己的開發服務器上進行一些本地調試。幾乎所有的代碼都可以強制它作爲auto_prepend。留下一些功能還有待執行; P

相關問題