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.
Kicsomagolás után mindkét könyvtárban hozzunk létre egy
Az Apache2 telepítését végezhetjük a letölthetőparanccsal. A szolgáltatás eltávolítását csak parancssorból tudjuk megtenni:Érdemes a parancssort nyitva hagyni, szükségünk lesz még rá. Az Készítsük el a fent hivatkozott 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 A 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:
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.
Írjuk a végére az alábbiakat:Hasonló sorokat tegyünk a Ezzel tulajdonképpen meg is vagyunk. A
hosts/php4/dummy-host.confilletve
hosts/php5/dummy-host.confEzután már csak egy dolgunk van. Nyissuk meg a a Nos, ide kell elhelyeznünk bejegyzéseinket, hogy a virtuális kiszolgálóink élni kezdjenek. Például létrehozhatunk egy Majd elkészítjük a
hosts/php4/test1-host.confEzek után ha a
Vigyázzunk, hogy a Ezzel a
A PEAR csomagkezelőnek az alábbi környezeti változókra van szüksége:
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őNéhány parancs magyarázatra szorulhat.
A fenti megoldással a
Az illusztráció alapja: Todd Klassy: Empurpled Entryways
■ A sorozatban megjelent
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
c:\Apache2\bin\Apache.exe -w -n "Apache2" -k uninstall
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
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"
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
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"
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. AzApache2-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 ac:\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>
httpd-php5.conf
-ba is:
NameVirtualHost *:85
<IfModule mod_php5.c>
Include hosts/php5/*.conf
</IfModule>
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>
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>
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
test1.localhost
kiszolgálót úgy, hogy ebbe a fájlba beírjuk:127.0.0.1 test1.localhost
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>
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 azetc/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
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 aphp.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 apear.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
- aphp.exe
elérési útvonala
PHP_PEAR_SYSCONF_DIR
- apear.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
- 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 aPHPRC
környezeti változóban.
- 11.sor: a
PATH
-ba bele kell tennünk aphp.exe
elérési útját, így csak aphp
parancsot kell kiadnunk, hogy elinduljon a parancsértelmező. A%PATH%
segítségével nem felülírjuk a jelenlegiPATH
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
xampp
-tedd fel az XAMPP-ot ;)
ott egy php-switch.bat elintézi a csereberét.
A csere...
Hiányos
Sanyi voltam
hosts
aldomain
c:/WINDOWS/system32/drivers/etc/hosts
állományba kell beírnod az aldomain nevét és IP címét, pl:Az Apache2 konfiguráció is szerepel.
Van valami amit kihagytam?
apache2 mod proxy
í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é:
Mindegyik site simán elérhető, azzal a különbséggel, hogy az egyiknél php4 van, a másiknál php5.
Azonos néven?
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: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-php5.localhost ->(proxy)-> http://teszt1.localhost:85
Jól értem? Ebben az esetben viszont egyel több virtuális hosztot kell konfigurálnod.
egy domain név -> egy php
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.
OK
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.
php5
Szolgáltatót meg rosszat kérdezel. Kérdezz meg engem, pl. :P
És megoldható-e...
PHP 4 x 2
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.
Sikerült megcsinálom, 2 szerverem van de...
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
Egy port - egy program