PHP Includes auf Windows verhalten sich anders als auf Linux/Darwin

Blackbenji

Lieutenant
Dabei seit
Nov. 2009
Beiträge
553
Hallo,

ich selber programmiere unter Darwin (OS X) und lasse mein "Produkt" auf einem Linux Server laufen.
Ein Kollege wollte unter Windows nun meinen Code mal testen.

Auf beiden System wird XAMPP in neuster Version benutzt.

Mir wurde fasst schlecht, alles was bislang funktioniert hat, funktionierte nicht mehr.
Die includes haben nicht mehr funktioniert. Als Lösung habe ich folgendes Eingebaut:
PHP:
switch(PHP_OS) {
    case "Darwin": define("SEPARATOR", "/"); break;
    case "Linux": define("SEPARATOR", "/"); break;
    case "WIN32": define("SEPARATOR", "\\"); break;
    case "WINNT": define("SEPARATOR", "\\"); break;
    case "Windows": define("SEPARATOR", "\\"); break;
    default: define("SEPARATOR", "/"); break;
}
Und alle Pfade mussten neu fix definiert werden.
Soweit so gut, bei mir keine Fehler - alles funktioniert.
Auf dem Windows System gibt es zumindest kein Fehler mehr. Aber meine Templates werden nicht angezeigt.

Die Template Engine ist kein Hit, funktionierte aber für meine Zwecke bislang:

PHP:
class Template
{

    var $TEMPLATE_DIR = TEMPLATE_DIR;
    var $TEMPLATE_VARS = array();

    /** @var BBcode * */
    protected $bbcode;

    public function __construct($bbcode)
    {
        $this->bbcode = $bbcode;
    }

    public function assign($key, $val = null)
    {
        $this->TEMPLATE_VARS[$key] = $val;
    }

    public function display($tpl_file)
    {
        if (!is_file($this->TEMPLATE_DIR . $tpl_file)) {
            exit('no such template file: ' . $tpl_file);
        }
        $TPL = & $this->TEMPLATE_VARS;
        $TPL_DIR = $this->TEMPLATE_DIR;
        include($this->TEMPLATE_DIR . $tpl_file);
        $clear = & $this->TEMPLATE_VARS;
    }

    private function setTemplateDir($tpl_dir)
    {
        if (!is_dir($tpl_dir)) {
            exit('invalid template path');
        }
        $this->TEMPLATE_DIR = $tpl_dir;
    }
}
Soweit so gut, ich rufe nun meine index.html auf:
PHP:
$tpl->display(FRONTEND . 'index.html');
inhalt:
PHP:
<? include('html'. $SEPARATOR .'header.html'); ?>

<?
if(isset($TPL['filename'])) {
    $file = $TPL['filename'];
    include('html'.SEPARATOR.$file.'.html');
} else {
    include('html'. SEPARATOR .'content.html');
}
?>
<? include('html'. SEPARATOR.'sidebar.html'); ?>
<? include('html'. SEPARATOR.'footer.html'); ?>
Und was ich im Browser erhalte ist:
PHP:
<? include('html'. SEPARATOR.'header.html'); ?>

<?
if(isset($TPL['filename'])) {
    $file = $TPL['filename'];
    include('html'.SEPARATOR.$file.'.html');
} else {
    include('html'. SEPARATOR.'content.html');
}
?>
<? include('html'. SEPARATOR .'sidebar.html'); ?>
<? include('html'. SEPARATOR.'footer.html'); ?>
1zu1 wird mir der Inhalt ausgegeben.

Auf meinem System und auch auf dem Linux-Server wird der Code richtig ausgeführt. Auf dem Windows System nicht.
Ich verstehe so langsam nicht mehr warum, weil auch kein Fehler ausgegeben wird ...
 

Blackbenji

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2009
Beiträge
553
die slashes sind nicht mehr das problem, auch wenn eure ansätze sicherlich einfacher sind, danke!

das problem ist nun eher dass mein include im template nicht funktioniert.
 

Blackbenji

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2009
Beiträge
553
danke, die sind in der tat aus, warum?
da ich nicht an das system von meinem kollegen komme, ging es nur per .htaccess
PHP:
php_value short_open_tag 1
 

killray

Lt. Commander
Dabei seit
Jan. 2009
Beiträge
1.045
Weil die Standardmäßig immer aus sind. Ich würde mir auch die <?php Version angewöhnen.
 

Blackbenji

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2009
Beiträge
553
Schon mal die Konstante von PHP selbst genutzt, um die Slashes richtig einzusetzen?

http://php.net/manual/en/dir.constants.php
ich habe das gerade nochmal aufgegriffen und das eigentlich problem identifiziert.
ich generiere am anfang eine "docroot", diese ist unter windows und unix anders, daher die eigentlichen probleme.

meine SEPARATOR änderung habe ich gerade gegen

PHP:
if (DIRECTORY_SEPARATOR=='/') {
    define('DOCROOT', dirname(__FILE__).'/');
} else {
    $absolute_path = str_replace('\\', '/', dirname(__FILE__)).'/';
    define('DOCROOT', $absolute_path);
}
ausgetauscht, damit muss ich nicht den ganzen code verändern und bin immernoch universell einsetzbar.
 

Daaron

Fleet Admiral
Dabei seit
Dez. 2011
Beiträge
13.487
; short_open_tag
; Default Value: On
; Development Value: Off
; Production Value: Off


Aus der php.ini von Debian 6. Da die meisten Server auf "production" stehen wird der Default überschrieben. Gewöhn dir <?php ?> an, das macht allen das Leben leichter.
 
Top