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

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
557
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 ...
 
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.
 
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
 
Weil die Standardmäßig immer aus sind. Ich würde mir auch die <?php Version angewöhnen.
 
killray schrieb:
Weil die Standardmäßig immer aus sind. Ich würde mir auch die <?php Version angewöhnen.

kann ja nicht sein wenn es ohne Anpassungen auf unix systemen immer an ist.
aber gut, problem behoben.
 
Janniboy schrieb:
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.
 
; 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.
 
Zurück
Oben