Перевод путей в PHP с сервера (* nix) на компьютер (winxp) dev - PullRequest
0 голосов
/ 28 сентября 2010

Я работаю над проектом PHP, в котором много жестко заданных путей. Я не главный разработчик, просто работаю над небольшой частью проекта.

Я бы хотел иметь возможность проверить свои изменения локально перед их фиксацией, но моя структура каталогов совершенно иная. Например, в коде много такого:

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

Что не работает на моем локальном сервере WAMP, потому что путь другой. Есть ли способ сообщить WAMP или XP, что "/ home / clientx / htdocs /" действительно означает "c: / shared / clients / clientx"?

Ответы [ 3 ]

1 голос
/ 28 сентября 2010

Если это локальная копия, выполните поиск и замену по всему каталогу, пожалуйста, не забудьте косую черту. И когда вы фиксируете код, делайте наоборот. Это решение, если вы не хотите добавлять дополнительные переменные и прочее (потому что это изменило бы код / ​​работу / зависимости других разработчиков (если есть)

найдите "/ home / clientx / htdocs /" и замените на это: "c: / shared / clients / clientx /"

1 голос
/ 28 сентября 2010

Всегда используйте $_SERVER['DOCUMENT_ROOT'] вместо жестко закодированного пути.

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

Что касается вашей среды Wamb, вам потребуется выделенный диск для имитации структуры файла.Вы можете использовать инструменты NTFS или простую команду subst для сопоставления некоторого каталога с диском.
Создайте папку /home/clientx/htdocs/ на этом диске и измените свой httpd.conf, чтобы он отображался.

Но опять же, вы сделаете себе огромную услугу, убедив своих коллег прекратить использовать жестко закодированные пути

0 голосов
/ 28 сентября 2010

ВНИМАНИЕ: ТОЛЬКО ИСПОЛЬЗУЙТЕ ЭТО РЕШЕНИЕ ДЛЯ АВАРИЙНОГО РЕМОНТА, НИКОГДА НЕ ДЛЯ ДЛИННОГО КОДА ПРОИЗВОДСТВА

Определите класс с помощью методов переписывания, см. 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');

Серьезно, только локальная отладка на вашем собственном dev-сервере. Вы можете использовать его как auto_prepend практически для любого кода. Оставьте некоторую функцию еще не реализовано; P

...