ugrás a tartalomhoz

Több PHP beállítása egy Windows rendszeren

Nagy Péter · 2006. Ápr. 8. (Szo), 23.00
Több PHP beállítása egy Windows rendszeren
A PHP mostanában fejlődésének fontos mérföldkövéhez érkezett. Stabilnak tekinthető a PHP 5-ös verziója, amelyben már a teljesen objektumorientált működéshez újraírt Zend 2 motor teljesít szolgálatot. Az örömteli helyzet ellenére több probléma is akadhat. Mielőtt valaki áttérne az új verzió használatára érdemes kipróbálnia, hogy az általa eddig készített kódok hogyan üzemelnek az új környezetben.

Ehhez persze szükséges lehet, hogy a két verzió párhuzamosan telepítve legyen a fejlesztői gépen, mert a régebbi PHP 4-es környezetben is folytatni kell a fejlesztést. Lehetséges, hogy valaki nem a PHP 4-es és PHP 5-ös verziók közötti váltást akarja tesztelni, hanem valamely két egymáshoz közelebb lévő változatot (pl. PHP 4.2.2 és PHP 4.4.2).

Egy másik, hasonló probléma lehet, ha egyazon fejlesztői gépen több párhuzamos fejlesztés van folyamatban. Linux környezetben ilyenkor több aldomaint használhatunk a tesztelésekhez, így választva el a projekteket egymástól. Ám Windows-on ez problémát jelenthet, főként ha csak dinamikus IP címmel rendelkezünk, hiszen szolgáltatónk DNS szerverébe kellene felvenni az aldomaineket.

Fejlesztést természetesen nem csak webes, hanem parancssori környezetben is végezhetünk, ilyenkor nem árt, ha ekkor is rendelkezésünkre áll mindkét PHP verzió. A PEAR csomagkezelő tipikusan parancssori eszköz, így ennek használatához mindenképpen tennünk kell valamit.

Több verzió

Az első problémát - a párhuzamos verziók telepítését - a következőképpen oldhatjuk meg. Tulajdonképpen az Apache és PHP telepítése kezdőknek Windows rendszereken című cikkben leírt folyamat lépéseit kell végigjárni néhány kisebb módosítással. Először is szükségünk lesz a PHP két különböző verziójára, amelyeket a http://hu.php.net oldalról letölthetünk. A bináris, de telepítő nélküli (zip segítségével tömörített) verziókat használjuk, hogy testre tudjuk szabni, hogyan kerüljön a gépünkre (illetve, hogy modulként tudjuk telepíteni ezeket). Csomagoljuk ki két tetszőleges könyvtárba. Javaslom, használjunk egyszerű és túl egzotikus karaktereket nem tartalmazó mappaneveket, ezzel a saját dolgunkat könnyítjük majd meg. Én létrehoztam egy mappát a PHP telepítések számára, majd ezen belül a két verziónak:
  • c:\php\4.4.2 illetve
  • c:\php\5.1.2.

Kicsomagolás után mindkét könyvtárban hozzunk létre egy /ini nevű almappát, és másoljuk ide a php.ini (illetve a php-cli.ini) állományokat.

Az Apache2 telepítését végezhetjük a letölthető .msi kiterjesztésű installer használatával, ahogy azt Robi cikkében olvashatjuk. Megint csak az egyszerű elérési útvonalak használatát javaslom. A telepítő ugyan alapértelmezésben a c:\Program Files\Apache Group\Apache2 könyvtárba telepítené a szervert, de ebben sok a szóköz, ráadásul igen hosszú is, így én a c:\Apache2 könyvtárba telepítettem. Azért szükséges az Apache 2.* verziója, mert bizonyos opciókat, amelyekre mindenképpen szükségünk lesz, csak ebben használhatunk (pl. a PHPINIDir direktíva). Ha ezzel megvagyunk, akkor állítsuk le és távolítsuk el a telepítő által elindított Apache2 nevű szolgáltatást. A leállítást megtehetjük az Apache Monitorból is, vagy parancssorból a

net stop Apache2
paranccsal. A szolgáltatás eltávolítását csak parancssorból tudjuk megtenni:

c:\Apache2\bin\Apache.exe -w -n "Apache2" -k uninstall
Érdemes a parancssort nyitva hagyni, szükségünk lesz még rá. Az c:\Apache2\conf\httpd.conf állományból készítsünk másolatot httpd-php4.conf néven, és nyissuk meg szerkesztésre. Írjuk az állomány végére:

Include conf/php4.conf
Készítsük el a fent hivatkozott php4.conf állományt is az alábbi tartalommal:

LoadModule php4_module "c:/php/4.4.2/sapi/php4apache2.dll"
AddType application/x-httpd-php .php
PHPINIDir "C:/php/4.4.2/ini"
Ezután a két előbb létrehozott fájlból csináljunk másolatot úgy, hogy "php4" helyett "php5"-öt írunk a nevükben. Nyissuk meg a létrejött httpd-php5.conf állományt és írjuk át benne az alábbiakat:

Listen 80 -> Listen 85
ServerName localhost:80 -> ServerName localhost:85
Include conf/php4.conf -> Include conf/php5.conf
A php5.conf állományban pedig cseréljük le a tartalmat erre:

LoadModule php5_module "c:/php/5.1.2/php5apache2.dll"
AddType application/x-httpd-php .php
PHPINIDir "c:/php/5.1.2/ini"
Ha fenti beállításokkal kész vagyunk, akkor már csak két parancs kiadása van hátra, de ehhez is parancssorra van szükségünk:

c:\Apache2\bin\Apache.exe -w -n "Apache2-php4" -f c:\Apache2\conf\httpd-php4.conf -k
install
c:\Apache2\bin\Apache.exe -w -n "Apache2-php5" -f c:\Apache2\conf\httpd-php5.conf -k
install
Magyarázat
A fenti beállításokkal két Apache szolgáltatást telepítettünk gépünkre. A két szolgáltatás azonos könyvtárat tekint gyökérkönyvtárnak, tehát azonos állományokat fognak kiszolgálni, de különböző portokon várják a kéréseket. Az Apache2-php4 nevű szolgáltatás a standard 80-as porton figyel, míg az Apache2-php5 szerver a 85-ös porton fut. Így ha PHP 4-es környezetben akarunk kipróbálni egy szkriptet, a http://localhost/szkript-neve.php címet kell beírni a böngészőbe, míg PHP 5-ös környezetben a http://localhost:85/szkript-neve.php a megfelelő cím.
A további környezetfüggő beállításokat már megtehetjük az elkészített állományokban anélkül, hogy azok egymásra hatással lennének. Például beállíthatjuk, hogy más könyvtárba kerüljenek a PHP 4 és egy másikba a PHP 5 alatt futó szkriptek naplóállományai.

Több párhuzamos projekt

Feltételezem, nem én vagyok az egyetlen, aki több feladaton dolgozik egyszerre. A kész oldalak teszteléséhez általában szükséges egy konfigurált webszerver, de valahányszor egy másik projekthez nyúlunk, másolgatni az állományokat vagy akárcsak a konfigurációban matatni nehézkes és sok hibalehetőséggel jár. Ahogy a bevezetőben írtam, a virtuális kiszolgálók létrehozása megoldás lehet, de Windowson akadályokba ütközünk, ha nincs hozzáférésünk a minket kiszolgáló névszerver konfigurációjához, márpedig általában ez a jellemző. Van megoldás! Hozzunk létre a c:\Apache2 könyvtár alá egy hosts\php4 és egy hosts\php5 mappát, majd nyissuk meg a httpd-php4.conf állományunkat.
Írjuk a végére az alábbiakat:

NameVirtualHost *:80
<IfModule sapi_apache2.c>
    Include hosts/php4/*.conf
</IfModule>
Hasonló sorokat tegyünk a httpd-php5.conf-ba is:

NameVirtualHost *:85
<IfModule mod_php5.c>
    Include hosts/php5/*.conf
</IfModule>
Ezzel tulajdonképpen meg is vagyunk. A hosts\php4 illetve hosts/php5 könyvtárakba tehetünk egy-egy konfigurációs állományt sablont is, hogy megkönnyítsük a virtuális kiszolgálók későbbi létrehozását:
hosts/php4/dummy-host.conf

#<VirtualHost *:80>
#    ServerAdmin admin@localhost
#    DocumentRoot c:\Apache2\htdocs
#    ServerName dummy-host.localhost
#    ErrorLog logs/php4/dummy-host.localhost-error_log
#    CustomLog logs/php4/dummy-host.localhost-access_log combined
#</VirtualHost>
illetve
hosts/php5/dummy-host.conf

#<VirtualHost *:85>
#    ServerAdmin admin@localhost
#    DocumentRoot c:\Apache2\htdocs
#    ServerName dummy-host.localhost
#    ErrorLog logs/php5/dummy-host.localhost-error_log
#    CustomLog logs/php5/dummy-host.localhost-access_log combined
#</VirtualHost>
Ezután már csak egy dolgunk van. Nyissuk meg a a c:\Windows\System32\Drivers\etc könyvtárban lévő HOSTS nevű állományunkat. Minden Windows XP telepítésen létezik, esetleg a Windows helyett Winnt könyvtár alatt kell megkeresnünk. Ennek tartalma valami hasonló:

# Copyright (c) 1993-1999 Microsoft Corp.
#
# Mintafájl a Microsoft TCP/IP for Windows-hoz.
#
# Ez a fájl IP címek és NT számítógépnevek (NetBIOS nevek) egymáshoz
# rendelésére szolgál. Minden egyes tételt külön sorba kell írni, először
# az IP címet, azt követően pedig a hozzá tartozó nevet. A cím és
# a név között legalább egy szóköz vagy tabulátor karakternek kell lennie.
#
# A # jel általában a megjegyzést tartalmazó sorokat jelöli, néhány
# kivételtől eltekintve (ezeket lásd alább).
#
# Példák:
#
#      102.54.94.97     rhino.acme.com          # forráskiszolgáló
#       38.25.63.10     x.acme.com              # x ügyfélállomás

127.0.0.1       localhost
Nos, ide kell elhelyeznünk bejegyzéseinket, hogy a virtuális kiszolgálóink élni kezdjenek. Például létrehozhatunk egy test1.localhost kiszolgálót úgy, hogy ebbe a fájlba beírjuk:
127.0.0.1       test1.localhost
Majd elkészítjük a c:\Apache2\hosts\php4\test1-host.conf állományt a dummy-host.conf másolásával és a benne lévő sorok értelemszerű átírásával és kikommentezésével:
hosts/php4/test1-host.conf

<VirtualHost test1.localhost:80>
    ServerAdmin admin@localhost
    DocumentRoot c:\Apache2\htdocs\test1
    ServerName test1.localhost
    ErrorLog logs/php4/test1.localhost-error_log
    CustomLog logs/php4/test1.localhost-access_log combined
</VirtualHost>
Ezek után ha a c:\Apache2\htdocs\test1 könyvtár létezik, akkor az Apache2-php4szolgáltatás újraindítását követően látni fogjuk a tartalmát a http://test1.localhost cím alatt.
Magyarázat
Windows környezetben (és egyébként Linux rendszereken is) létezik az etc/hosts állomány, amely helyi névfeloldást teszt lehetővé a futó szolgáltatásoknak. Ha ebben a keresett kiszolgálónév megtalálható, és tartozik hozzá érvényes IP cím, akkor a rendszer oda fogja irányítani az adott kiszolgálónévre irányuló kéréseket. A 127.0.0.1 IP cím minden esetben a saját gépünket jelenti, tehát ha egy virtuális kiszolgáló nevéhez hozzárendeljük ezt a címet, az Apache meg fogja kapni a kéréseket. Mivel a NameVirtualHost direktívával megadtuk neki, hogy a virtuális kiszolgálók között név alapján kívánunk különbséget tenni, a szerver megkeresi a konfigurációjában az adott nevű kiszolgálót és átadja annak a kérést.
Vigyázzunk, hogy a hosts állományban a bejegyzést előbb tegyük meg, minthogy az Apache szolgáltatást újraindítjuk, mert a szerver ellenőrzi a névfeloldást, és ha nem talál hozzárendelhető IP címet, akkor nem hozza létre a virtuális kiszolgálót. Azt, hogy milyen virtuális kiszolgálók vannak definiálva egy Apache konfigurációban, lekérdezhetjük például a következő paranccsal:
c:\Apache2\bin\Apache.exe -w -f c:\Apache2\conf\httpd-php4.conf -S
Ezzel a httpd-php4.conf állományban előírt virtuális kiszolgálók listáját kaphatjuk meg.

PEAR csomagkezelő

Felmerülhet kérdésként: mi a helyzet egy ilyen vegyes környezetben a konzolos PHP alkalmazásokkal, mint amilyen például a PEAR is? Mivel a parancssori alkalmazásoknak szükségük van a php.exe állományra, valahogy közölnünk kell velük, hogy hol találják azt. Be kell állítani azt is, hogy a futó parancsértelmező hol keresse a php.ini állományt, és meg kell adnunk minden szükséges környezeti változót is, amelyet programunk esetleg használ futása közben.
A PEAR csomagkezelőnek az alábbi környezeti változókra van szüksége:
  • PHP_PEAR_BIN_DIR - itt keresi például a pear.bat állományt
  • PHP_PEAR_DATA_DIR - ide teszi például a csomagok adatállományait
  • PHP_PEAR_DOC_DIR - csomag dokumentációk helye
  • PHP_PEAR_INSTALL_DIR - a csomagok könyvtárstruktúrájának gyökere lesz
  • PHP_PEAR_PHP_BIN - a php.exe elérési útvonala
  • PHP_PEAR_SYSCONF_DIR - a pear.ini helye
  • PHP_PEAR_TEST_DIR - a csomagokhoz tartozó tesztek helye

A karbantarthatóság érdekében ezeket a beállításokat egy helyen és egyszerre érdemes megtenni. Egy lehetséges megoldás, ha létrehozunk minden külön PHP verzióhoz egy batch állományt, és ezek segítségével hozzuk létre a kívánt futási környezetet. Íme a nálam működő php5-cli.bat állomány tartalma:

@ECHO OFF
SETLOCAL
SET PHP_PEAR_BIN_DIR=c:\php
SET PHP_PEAR_DATA_DIR=c:\php\pear\data
SET PHP_PEAR_DOC_DIR=c:\php\pear\docs
SET PHP_PEAR_INSTALL_DIR=c:\php\pear
SET PHP_PEAR_PHP_BIN=c:\php\5.1.2\php.exe
SET PHP_PEAR_SYSCONF_DIR=c:\php
SET PHP_PEAR_TEST_DIR=c:\php\pear\tests
SET PHPRC=c:\php\5.1.2\ini
SET PATH=%PATH%;c:\php\5.1.2
START
EXIT
Néhány parancs magyarázatra szorulhat.
  • 2.sor: a SETLOCAL utasítja az operációs rendszert, hogy ettől kezdve a változtatások csak lokálisan az adott ablakra vonatkozzanak. Így nem változtatunk semmit a rendszerbeállításokon.
  • 10. sor: mint előbb említettem meg kell mondani a PHP prancsértelmezőjének, hogy hol keressen a php.ini állományt. A dokumentáció szerint ezt többféleképpen is megtehetjük. Parancssorban használhatjuk a "-c" kapcsolót, vagy beállíthatjuk a PHPRC környezeti változóban.
  • 11.sor: a PATH-ba bele kell tennünk a php.exe elérési útját, így csak a php parancsot kell kiadnunk, hogy elinduljon a parancsértelmező. A %PATH% segítségével nem felülírjuk a jelenlegi PATH beállításokat, hanem hozzáfűzzük a sajátunkat.
  • 12.sor: a START parancs új parancs ablakot nyit, amelyben az eddigi beállítások érvényesek lesznek.
  • 13.sor: az EXIT-tel a futó parancssori ablakot bezárhatjuk, hiszen nyitottunk egy újat, amelyben beállításaink érvényesek.

A fenti megoldással a php5-cli.bat állomány futtatásakor kapunk egy parancssori ablakot amelyben a PHP 5.1.2 számára szükséges környezeti beállítások érvényesek anélkül, hogy a rendszerünk alapbeállításait megváltoztattuk volna. Egy hasonló állományt készíthetünk a PHP 4-es verziójához is.

Zárszó

A fenti beállításokkal létrehozhatunk egy olyan fejlesztői rendszert, amelyen egyszerre több futó projekten (website, API stb.) dolgozhatunk, úgy hogy a készülő kódokat párhuzamosan több PHP verzió alatt is tesztelhetjük. Így nem csak az állandó újrakonfigurálást takaríthatjuk meg, de a későbbi verzióproblémák jó részét is. Érdemes olvasgatni az Apache telepítővel érkező és a szerver honlapján is elérhető kézikönyvet, igen hasznos eszközöket találhatunk benne a fejlesztői környezet további testreszabásához. Például nagyon hasznosnak találtam a fenti beállítások teszteléséhez a server-status illetve server-info modulokat, mivel minden olyan információt megadnak a működő Apache kiszolgálóról, ami a konfiguráláshoz szükséges, és mindezt a böngészőablakban teszik.

Az illusztráció alapja: Todd Klassy: Empurpled Entryways
 
Nagy Péter
Szabadidőmben úszni szoktam: néha vízben, néha munkában... de egy Vízöntőnél állítólag ez így természetes.
1

xampp

ratson · 2006. Ápr. 10. (H), 17.28
vagy az egész egy lépésben:
-tedd fel az XAMPP-ot ;)

ott egy php-switch.bat elintézi a csereberét.
5

A csere...

Nagy Péter · 2006. Ápr. 11. (K), 14.30
... egyetlen hátulütője, hogy párhuzamosan nem mennek. Vagy a XAMPP (nem használom) is lehetővé teszi a két verzió párhuzamos futtatását?
2

Hiányos

Anonymous · 2006. Ápr. 10. (H), 19.46
Jó a cikk, egy kérdésem lenne, hogy localhost alá lehet aldomaint felvenni?

Sanyi voltam
3

hosts

janoszen · 2006. Ápr. 11. (K), 11.07
Ez nem tartozik a cikk hatáskörébe. A hosts tábla módosításával tudod elérni. Ha Windowst használsz, keress rá a rendszermeghajtón, hogy "hosts" és abba tedd bele a kívánt aldomaint. Ez után állítsd be a webszerveren, hogy ezt szolgálja ki.
4

aldomain

Nagy Péter · 2006. Ápr. 11. (K), 14.28
A cikkben szerepel is, hogy a c:/WINDOWS/system32/drivers/etc/hosts állományba kell beírnod az aldomain nevét és IP címét, pl:
127.0.0.1 teszt.localhost

Az Apache2 konfiguráció is szerepel.
Van valami amit kihagytam?
6

apache2 mod proxy

dtaylor · 2006. Ápr. 12. (Sze), 12.05
Szia!

így futott nálam régebben a php4-php5 együtt (linuxon). Annyi megjegyzést tennék még hozzá:

Nem kell, hogy az egyik szervert a 85-ös porton érd el. Ott az apache az játsszon proxy-t a 80-as porton a 85 felé:

<VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName site.host

        SSLEngine               Off
        ServerSignature         Off

        <IfModule mod_proxy.c>
                ProxyPass / http://site.host:85/
        </IfModule>
</VirtualHost>
A 85-os porton futó hoston meg uu. megcsinálod a virtualhost configot, és kész.
Mindegyik site simán elérhető, azzal a különbséggel, hogy az egyiknél php4 van, a másiknál php5.
7

Azonos néven?

Nagy Péter · 2006. Ápr. 12. (Sze), 13.14
Köszönöm, jó a javaslat de egy dolgot nem értek.
Az általam javasolt megoldásnál ugye úgy teszek különbséget a PHP verziók között, hogy más portszámot írok azonos domainnevek után, pl.:
http://teszt1.localhost
http://teszt1.localhost:85

A proxy megoldásnál ezek szerint nem lehet azonos a domainnév, hiszen akkor az Apache nem tudná eldönteni, hogy most "proxyzzon" vagy sem.
Tehát az általad javasolt megoldás valahogy így nézne ki:
http://teszt1-php4.localhost
http://teszt1-php5.localhost ->(proxy)-> http://teszt1.localhost:85

Jól értem? Ebben az esetben viszont egyel több virtuális hosztot kell konfigurálnod.
8

egy domain név -> egy php

dtaylor · 2006. Ápr. 13. (Cs), 08.23
A tesz.localhost site php4-es. A teszt1.localhost php5-os.

Site-onként van másik php. Annyi a különbség, hogy transzparens, nem veszed észre: nem kell foglalkozni azzal, hogy milyen port. Csak domain-név van, portok nélkül. Nekem ez szempont volt, hogy teljesen "éles" környezetben fejlesszek, úgy ahogy a végleges helyén is lesz majd a site/program. Ezért van open_basedir beállításom és mindenféle olyan biztonsági dolog is beállítva, amit be szoktak tenni éles szervereken is.

Igen, mindegyik apache-ben be kell állítani egy virt.hostot. Mondjuk, abban emelyik proxy-zik, abban sokkal egyszerűbb a cofig file. Kicsit több munka (akár egy perccel is hosszabb lehet egy host esetén a proxy-zós apache vhost beállítása!!! :)) ), de valamit valamiért.

Egyébként meg fastcgi-vel kell a php-t futtatni. Ott hostonként csak egy virtual host config file van, nem a webszerver jogokkal fut, nem kell hozzá php verziónként még egy webszerver, nem vagy php verzióhoz kötve, stb.

Bár, az egésznek igazából semmi jelentősége: php5 rokz.
9

OK

Nagy Péter · 2006. Ápr. 13. (Cs), 09.58
Félreértések elkerülése végett: nem kötekedni akartam. A mod_proxy-t még nem használtam, ezért kérdeztem vissza. :)
A PHP 5-ről a véleményünk egyezik, sajnos a szolgáltatók közül szinte senki nincs akinél már telepítve lenne.
10

php5

dtaylor · 2006. Ápr. 13. (Cs), 20.29
Nem is vettem kötekedésnek, nyugi. Leírtam, amit tudok/gondolok.

Szolgáltatót meg rosszat kérdezel. Kérdezz meg engem, pl. :P
11

És megoldható-e...

Beren · 2006. Júl. 1. (Szo), 11.55
...ugyanez két négyes verziójú PHP-vel (4.3.11 és 4.4.2)? Merthogy ilyenkor mindkettő a php4ts.dll-t keresgéli. Ahhoz, hogy ezt megtalálja, felvettem a két PHP gyökérkönyvtárát a PATH-ba, így viszont az először megtalált dll-t használja, ez meg okoz némi kavarodást...
12

PHP 4 x 2

Nagy Péter · 2006. Júl. 2. (V), 22.19
Szia!

Elvileg a php4ts.dll-t csak akkor keresi a PATH-ban, ha a
php.exe (CGI,CLI) / php4apache2.dll (SAPI)
-vel azonos könyvtárban nem találta meg. Igaz ez minden dll-re. Másold
oda a megfelelő dll-eket(sapi, stb) és akkor nincs szükség a PATH-ra.
Pl. ha a php4apache2.dll-t kimásolod a c:\php\4.3.11 könyvtárba,
illetve a c:\php\4.4.2 könyvtárba (mindegyikbe a megfelelő verziójút)
és ezt az útvonalat adod meg az Apachenak, akkor nem fog a PATH-ban
kutakodni a php4ts.dll után.
13

Sikerült megcsinálom, 2 szerverem van de...

vtsoftware · 2007. Nov. 17. (Szo), 16.34
...van mellé egy kérdésem is.

Most csak egy szerver futhat egyszerre.
Meg lehet oldani hogy kettőt vagy többet is lehessen egyszerre futtatni?
Igaz mind a 2 a 80-as porton van és nem 2 verziójú PHP-vel csak az 5-össel.
Lehet az a baj hogy mind a 2-t a 80-as potra állítottam?

Köszi szépen
14

Egy port - egy program

zila · 2007. Nov. 19. (H), 12.25
Az biztosan rossz, ha mindkettő ugyanazon a porton figyelne. Egy porto egy program figyelhet. De minek van 2 szerver ha mindkettőn ugyanaz a php fut?