Installation af PHP på Windows

Intro

Dette er en huskeseddel til næste gang, jeg skal installere en ny PHP-version, så jeg forhåbentlig kan bruge meget kortere tid på det end denne gang.

Min opgave var at installere den nyligt frigivne PHP 7.0.0 på min lokale IIS-server og på Wamp (der anvender Apache-server), begge på Windows 10.

Desuden skulle det fungere, så man kan skifte mellem forskellige PHP-versioner. Der er endnu kun få, der har PHP 7 installeret på webhoteller, så for både at have et troværdigt udviklings-setup og have mulighed for at “lege med det nye” er det nødvendigt at have flere versioner.

Som en sidegevinst fandt jeg også ud af, hvordan man styrer hvilken PHP CLI-version, der er aktiv pr. default (til at køre PHP fra en command prompt).

Download

PHP

PHP kan hentes på php.net som .zip-filer. Men vær opmærksom på, at der er flere versioner!

Der er 32 bit- (x86) og 64 bit- (x64) downloads. 64 bit-udgaverne før PHP 7.0 er “experimentelle”, men da jeg bruger 32 bit, kan jeg ikke sige, hvor godt de kører.

For hver af dem er der en Thread Safe- og en Non Thread Safe-udgave. Non Thread Safe-udgaven har “nts” i navnet på .zip-filen.

IIS bruger Non-Thread Safe (NTS)-udgaven, og Apache bruger Thread Safe (TS)-udgaven. Så sørg for at downloade den/de rigtige udgaver – der er 4 forskellige til hver PHP-version!

Xdebug

Desuden skulle jeg bruge Xdebug. Den har de samme 4 udgaver og kan downloades på xdebug.org.

Visual C++ Redistributable for Visual Studio

Til PHP 7 skal der hentes en fil fra Microsoft: Visual C++ Redistributable for Visual Studio 2015 – til enten 32 bit (x86) eller 64 bit (x64).

OBS: Der er flere forskellige versioner: VC9, VC11 og VC14 – de skal matche den downloadede PHP-udgave.

Der er links til VC-filerne på PHP download-siden.

Den downloadede fil er en almindelig Windows-installations-fil (.msi). Kør den og svar ja til alt.

WAMP/Apache

Opret en ny mappe parallelt med din(e) nuværende PHP-installation(er). I WAMP er det <WAMP-dir>/bin/php/. Jeg navngiver mapperne efter PHP-versions-nummer (fx php7.0.0).

Udpak Thread Safe-udgaven til den nye mappe.

Kopiér følgende filer fra en tidligere PHP-version under WAMP:

  • php.ini
  • phpForApache.ini
  • wampserver.conf

Xdebug

Opret en ny mappe zend_ext under den nye php-mappe (dvs. parallelt med ext, lib etc.).

Udpak Thread Safe-udgaven til denne mappe.

OBS: Hvis Xdebug ikke tidligere har været installeret, skal der tilføjes nogle settings i php.ini. Check xdebug.org.

php.ini

Der er to ting, der (muligvis) skal rettes i den kopierede php.ini:

  • Søg efter extension_dir = <sti til mappe>.
  • Hvis der bare står extension_dir = ext (og det virker), så lad det stå uændret.
  • Hos mig står den fulde sti, så derfor: Ret stien til den nye version.
  • Søg efter zend_extension = <sti til mappe med xdebug>.
  • Hvis der bare står zend_extension = “zend_ext/php_xdebug--.dll” (og det virker), så lad det stå uændret.
  • Hos mig står den fulde sti, så derfor: Ret sti og filnavn til den nye version.

Det burde normalt være alt.

Check evt. php.ini-development for, om der er nye extensions, du har brug for – og aktivér efter behov. Det gøres ved at checke, om extension-filen er i ext-mappen og så udkommentere den pågældende linje i php.ini.

phpForApache.ini

Her skal gøres fuldstændigt de samme ting som for php.ini.

wampserver.conf

Hvis der er tale om opgradering til en ny “major” udgave af PHP (fx fra PHP 5 til PHP 7), skal der tilføjes et par linjer i wampserver.conf:

$phpConf['apache']['2.4']['LoadModuleName'] = 'php7_module';
$phpConf['apache']['2.4']['LoadModuleFile'] = 'php7apache2_4.dll';

(Eksemplet er med en Apache 2.4 og PHP 7. Check evt. Apache-version – samt filnavnet på phpXapacheY_Z.dll i php-mappen.)

Genstart og check

Det er vist alt. Luk Wamp Manager og start den igen, så den registrerer den nye PHP-version. (Muligvis er det nok at højre-klikke på Wamp Manager og vælge refresh ...)

Wamp Manager skulle nu gerne have registreret den nye PHP-version, og du bør kunne skifte til den på Wamp Manager (under PHP -> version).

Check med en .php-fil, der indeholder <?php phpinfo(); ?>, om du kan skifte korrekt mellem de forskellige PHP-versioner.

Check også, om det er den rigtige php.ini, der bliver loadet! Tilsyneladende er det den samme php.ini – nemlig <wamp-dir>\bin\apache\apache<apache-version>\bin\php.ini – men check indholdet af den pågældende fil (den bliver kopieret fra php-mappen).

Hvis der er problemer med at få den til at skifte, kan det muligvis hjælpe at genstarte Windows.

IIS (Internet Information Server)

Opret en ny mappe parallelt med din(e) nuværende PHP-installation(er). (OBS: Mappen kan i princippet være hvor som helst – det er bare mest praktisk at have dem samlet.) Jeg navngiver mapperne efter PHP-versions-nummer (fx php-7.0.0).

Udpak Non-Thread Safe-udgaven til den nye mappe.

Kopiér php.ini fra en tidligere PHP-version under IIS

Xdebug

Opret en ny mappe zend_ext under den nye php-mappe (dvs. parallelt med ext, lib etc.).

Udpak Non-Thread Safe-udgaven til denne mappe.

OBS: Hvis Xdebug ikke tidligere har været installeret, skal der tilføjes nogle settings i php.ini. Check xdebug.org.

php.ini

Der skal redigeres fuldstændigt de samme ting som under WAMP, så check dér.

IIS Manager

I IIS Manager, gå ind vælg Default Web Site i menuen til venstre. I hoved-vinduet vælg Handlertilknytninger (i den engelske-sprogede udgave hedder det vist Mappings(?)).

Check hvilke(n) handler(e), du har til at håndtere *.php-filer – nu skal der bare oprettes en ny handler. Det gøres således:

I menuen til højre (Handlinger), vælg Tilføj modultilknytning ... – og et nyt vindue åbner.

De 4 felter udfyldes således:

  • Anmodningssti: *.php
  • Modul: FastCgiModule
  • Eksekverbar fil: Stien til php-cgi.exe i den mappe, du pakkede php-filerne ud i. *)
  • Navn: Frit valg – jeg plejer at bruge PHP-versionen (fx php-7.0.0 – samme navn som php-mappen)

*) Tip: Du behøver ikke kopiere sti-navnet til php-cgi.exe (eller huske den præcist). Start med at skrive drev-navn og de første par bogstaver i hver mappe, så udfylder IIS Manager selv.

Næst-nederst er der en knap, der hedder Anmodningsbegrænsninger ... Jeg plejer at ændre Tilknytning til Fil eller mappe og lade de to andre være uændrede (Verber: Alle verber og Adgang: Script).

Klik OK to gange, og handleren er oprettet.

Hvilken PHP-version?

Der er nu to eller flere handlere for *.php-filer – men hvilken er aktiv?

Først skal du genstarte IIS Server – det foregår i IIS Manager øverst i menuen til venstre (højreklik og vælg Stop og derefter Start).

Normalt er det den ny-installerede, der er aktiv, men check med en .php-fil, der indeholder <?php phpinfo(); ?>.

Hvis resultatet er fint for dig, så stop her. Hvis du vil kunne skifte mellem flere PHP-versioner (eller du ikke får den nye PHP-version aktiv), så fortsæt.

Skift mellem PHP-versioner

Det er (primært) den interne sortering i IIS Manager, der bestemmer hvilken PHP-version, der er aktiv.

Under Handlertilknytninger i menuen til højre (Handlinger) vælg Vis sorteret liste. Brug Flyt op / Flyt ned-knapperne til højre til at flytte den ønskede PHP-version øverst.

Når det er gjort, så genstart IIS Server.

Check med din phpinfo-fil, om du kan skifte korrekt mellem de forskellige PHP-versioner. Og check, at det er forskellige php.ini-filer, der loades. Husk at genstarte IIS, hver gang du har ændret i sorteringen – eller i øvrigt ændret noget.

Alt burde normalt være OK nu.

PHPRC

Hvis du ikke kan skifte php.ini-version, kan det muligvis skyldes en miljøvariabel, der hedder PHPRC. Den indeholder mappenavnet på hvor php.ini-filen for den anvendte PHP-version findes. (Note 1)

Slet den og genstart Windows, da der skal anvendes forskellige php.ini’er til hver PHP version.

Det er muligt (i IIS Manager) at indstille forskellige miljøvariable til hver handler, men det har jeg ikke haft brug for, så spørg en anden (Google), hvis du har brug for det.

Skift PHP-version med web.config

For fuldstændighedens skyld skal det nævnes, at man med web.config kan definere på site- og mappe-basis hvilken PHP-version, der skal køres.

web.config er en konfigurations-fil til IIS i XML-format. Den over-rider settings i IIS Manager for den mappe, den ligger i, og underliggende mapper. (Den er IIS’s parallel til Apache’s .htaccess – sådan lidt hurtigt fortalt.)

Hvis man ikke i forvejen har en web.config-fil, er det ikke for begyndere at justere den korrekt. Men hvis man allerede har én, så er det ret enkelt at tilføje en ny PHP-version:

I configuration -> system.webServer -> handlers er der en række direktiver, der starter med <add name ...>. Find en PHP-handler og kopiér den + ret handler-navn (til det navn, handleren har i IIS Manager) og ret stien, så den peger på den rigtige til php-cgi.exe.

Placér herefter den ønskede handler øverst – og gem filen. Handler-skiftet i web.config kræver ikke genstart af IIS – så det er en hurtig måde at skifte på for et bestemt website eller mappe!

OBS: Det er nok en god idé at lave en backup af web.config, inden du begynder at redigere, hvis du er usikker på, hvad du gør.

OBS: Pas på med flere niveauer af web.config – det kan let give “sjove” fejl fra IIS i din browser.

PHP CLI

PHP har siden version 5.4.0 haft en indbygget webserver. Den kan være ganske nyttig, hvis man fx hurtigt vil checke noget PHP i en mappe, der måske ligger helt uden for det normale web-scope.

Start serveren fra en command prompt i den pågældende mappe med

php –S localhost:3300 (eller en hvilken som helst anden adresse:port-kombination)

Gå så til http://localhost:3300/sti-til-fil i din browser og check resultatet.

Hvis du vil se, hvad den ellers kan, så skriv php -h.

php -v viser CLI-versionen, -t sætter dokument-roden, --ini viser stien til den anvendte php.ini osv.

Hvilken PHP-version?

Mit problem var, at jeg ikke kunne finde ud af, hvorfor den valgte at bruge en tudse-gammel PHP-version (5.4.16 i Wamp) – selv om jeg både havde ændret PHP-version i Wamp og IIS.

Efterhånden fandt jeg ud af, at det skyldes, at Windows’ PATH-miljøvariabel indeholdt stien til netop denne PHP-version. Så løsningen er at ændre path-variablen, så kun stien til den ønskede PHP-version står der.

OBS: Check både System- og Bruger-miljøvariable. Min lå i System (det gør den ikke længere). (Note 2).

OBS: Husk at genstarte Windows, hver gang du laver ændringer i miljøvariable!

TIP: Path-listen er ofte lang, og det er nemt at lave fejl, når man redigerer i den.

Lav i stedet en ny miljø-variabel (fx kaldet PHP_PATH), hvor du skriver stien til den ønskede PHP-version. Inkludér herefter navnet på variablen med %-tegn før og efter den i path’en (fx: sti-14; sti-15;%PHP_PATH%). Næste gang skal du kun redigere stien i PHP_PATH (hvor det er sværere at lave fejl).

Skift PHP-version

Hvis du ofte skifter mellem PHP CLI-versioner, så er det lidt (læs: meget) besværligt at skulle a) redigere miljøvariabel og b) genstarte Windows, hver gang du ønsker at skifte.

I stedet kan man lave en .bat-fil med en menu-funktion, der vælger forskellige PHP-versioner. Hvert menupunkt skal indeholde en path-kommando og den fulde sti til den php.exe, der skal køres – fx:

PATH=%PATH%;c:\wamp2.4\bin\php\php5.6.16
start c:\wamp2.4\bin\php\php5.6.16\php -S localhost:3333

Det er ligegyldigt, om du vælger en PHP-version, der kører på Wamp/Apache eller IIS.

Jeg har kaldt filen for runphp.bat og lagt den i en mappe, der er i Windows’ path. Så kan den køres fra en hvilken som helst mappe ved at skrive runphp fra en command prompt.

Afrunding

Der er en masse, jeg ikke har fået med. Og der er muligvis også noget, jeg har misforstået. Så check selv oplysningerne andre steder på nettet.

Good luck!

Noter

Note 1: Under System -> Avancerede systemindstillinger.

Note 2: Hvis du søger miljøvariable i Windows, får du kun fat i Bruger- miljøvariable, og du kan ikke redigere System-miljøvariable. Søg i stedet på System og vælg Avancerede systemindstillinger, og du kan redigere begge.