[2003] IIS+PHP includen gaat opeens fout

Pagina: 1
Acties:

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 04-02 17:31
Hallo allemaal,

Wij hebben een nieuwe webserver gekregen en proberen onze sites over te zetten. We hebben een aantal sites die gebruik maken van PHP en we gebruiken IIS als webserver.
Op onze oude webserver werkte het includen van de bestanden goed, maar op de nieuwe niet meer. Bijvoorbeeld dit:

include("./extra/project.display.php");

werkte eerst wel, maar op de nieuwe server kan hij het bestand niet vinden. Als ik er dan dit van maak:

include("extra/project.display.php");

werkt deze include wel goed, maar in het bestand wat hij zojuist geinclude heeft staat een include naar een bestand in de document root en die gaat weer fout, want dan kan hij het pad niet vinden. Wie weet waarom dit opeens niet meer werkt? De oude php versie was 4.3.9 en we gebruiken nu 4.4.4

Hail to the king baby!


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 04-02 17:31
Helaasch niet :( staat bij de oude en bij de nieuwe server uit.

Hail to the king baby!


  • elevator
  • Registratie: December 2001
  • Niet online

elevator

Officieel moto fan :)

Begin anders eens met de PHP versies gelijk te trekken (en ook de INI files) zodat je zeker weet dat het aan je IIS PHP installatie ligt? :)

Verwijderd

een . in ./extra.php staat voor 'current working directory' oftewel de huidige werk directory. deze kun je in php ook achterhalen met getcwd(). ik denk dat in je huidige iis installatie de 'current working directory' is veranderd en dat daarom dus de locaties niet meer kloppen.

zelf vind ik het BAD PRACTICE om op die manier bestanden te included. ik zou een constante aanmaken met de begin plek van je website en deze in elke include gebruiken.

voorbeeldje:
PHP:
1
2
3
4
 define("MY_SITEROOT", "D:/www/mysite/", true);

 include_once(MY_SITEROOT."extra/blaat.php");
 include_once(MY_SITEROOT."somewhere.php");


dit is een veel beter manier en als je je site dan verplaatst vervang je gewoon alleen de waarde van de constante. en nog een tip gebruik altijd include_once als iets maar een keer dient te worden geinclude.

  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 04-02 17:31
@Docey, bedankt voor de informatie dit helpt me verder!

Ik heb even gekeken op de nieuwe server en met getcwd() krijg ik deze cwd:

D:\inetpub\website2\www\scripts

terwijl dat toch

D:\inetpub\website2\www

zou moeten zijn. Weet iemand hoe dit kan? En of ik dit nog aan kan passen? Ik heb ook even geprobeerd om de scripts map te hernoemen en dan krijg ik helemaal raar gedrag. Als ik die map hernoem en dan de getcwd aanroep krijg ik dit als cwd:

D:\inetpub\website3

Dus IIS gaat naar een directory die niet bij deze website hoort! IIS is als volgt ingedeeld:

3 websites:

1 website met als doc-root c:\inetpub\wwwroot met een aantal virtual directories die op d:\inetpub\ staan.

1 website met als doc-root d:\inetpub\website2\www, geen virtual directories.

1 website met als doc-root d:\inetpub\website3, geen problemen met deze website.

Hail to the king baby!


Verwijderd

mijn advies is om nu gewoon alle includes te bewerken en doe het dan ook gewoon in een keer goed zoals in het voorbeeld wat ik gaf. dat is gewoon de beste optie, niet alleen voor nu maar ook voor de toekomst en eigenlijk een kleine moeite, tenzij je letterllijk duizenden includes hebt maar dan heb je zowieso een groter probleem en kun je beter opniew beginnen.

dat is ook iets om over na te denken als je nieuwe websites maakt want je website zou niet afhankelijk mogen zijn van je server-configuratie om te werken. editten dus!

ik denk dat iis D:\inetpub\website2\www\scripts geeft om dat dat de directory is waar vanuit het php-script wordt gestart. iis zet dus de current-working-directory naar de locatie van het bestand dat wordt uitgevoerd. alhoewel dit eigenlijk wenselijk is, kan jouw script er dus niet mee omgaan omdat alle locaties hardcoded zijn.

eigenlijk hoef je alleen in dit eerste script de constante aan te maken en dan een 'search&replace' voor de tekst include(". te vervangen door include(MY_SITEROOT." en laat de computer de rest doen.

[ Voor 33% gewijzigd door Verwijderd op 20-01-2007 05:23 . Reden: uitleg waarom iis dit zo doet ]


  • urk_forever
  • Registratie: Juni 2001
  • Laatst online: 04-02 17:31
Dit heb ik uiteindelijk ook maar gedaan. Ik heb een constante gemaakt en die toegevoegd aan alle php bestanden (een stuk of 200 :'( ) en alle includes/requires/file_exists enzo aangepast zodat ze die constante gebruiken.

Het vreemde met die current working directory is dat als ik een test.php in de root van de site zet (D:\inetpub\website2\www\) en daarin alleen zet echo "CWD: " . getcwd(); dat hij dan alsnog D:\inetpub\website2\www\scripts als current dir geeft. Dat zou toch niet mogen :?

Hail to the king baby!

Pagina: 1