PHP

PHP FPM beállítása Apache HTTPD 2.2 és 2.4 alatt

Írtam már a mod_cgi/mod_cgid és a mod_fcgid modulokról, amikkel a PHP több verzióját futtathatjuk egyszerre. A PHP FPM viszont egy ezeknél is jobb megoldás. Azért mégsem tejesen új, mivel a mod_fastcgi vagy mod_fcgid Apache modulok egyike kell hozzá. Bár előbbiről nem esett még külön szó az említés szintjén felül, most ezt is telepítjük, mivel az Apache HTTPD 2.2 nem támogatja a szükséges mod_proxy_fcgi modult a mod_fcgid használatához.

A fejezet végén tehát már ismerni fogjuk mindkét lehetőséget és mindkét webszerver képes lesz bármely PHP verziót FPM-en keresztül futtatni tetszőleges felhasználó nevében.

Előbb azonban mindenképp javaslom a PHP telepítéséről szóló fejezet elolvasását, ahol az FPM telepítéséhez szükséges konfigurálásról írtam. Valamint az előző CGI megoldásokról szólót is.

Megosztás/Mentés

PHP futtatása Apache mod_fcgid modullal

A mod_cgid modullal lehetőség nyílik a PHP-t úgy futtatni Apache szerveren, hogy nem olvassa minden kéréskor a php.ini-t, de továbbra is élvezhetjük a több PHP verzió futtatásának előnyeit. Ebben a fejezetben a mod_fcgid modul beüzemeléséről írok kizárólag olyan mértékben, ami szükséges virtuális hosztonkénti tetszőleges PHP futtatásához.

A fejezet elolvasása előtt mindenképp nézd meg az előkészületekről szóló részt: PHP CGI megoldások Apache webszerveren

Javaslom a mod_cgid modullal foglalkozó fejezet átolvasását is: PHP futtatása Apache mod_fcgid modullal

Megosztás/Mentés

PHP futtatása Apache mod_cgi/mod_cgid modullal.

Egy módja és egyben a legrégibb módja a több PHP verzió használatának Apache szerveren a címben szereplő mod_cgi és mod_cgid modulok használata. Tesztidőszak alatt jó megoldás lehet és nem igényel további külső modulokat. Ebben a fejezetben ennek beállítását mutatom be a korábban beállított virtuális hosztokon.

A fejezet elolvasása előtt mindenképp nézd meg az előkészületekről szóló részt: PHP CGI megoldások Apache webszerveren

Megosztás/Mentés

PHP CGI megoldások Apache webszerveren

Az előző fejezetekben igyekeztem kellően előkészíteni ezt a lépést, ahol is a beállított virtuális hosztokhoz hozzárendelhetjük a CGI-ként futtatható PHP verziókat. Már ennek is volna több megoldása. Ebben a fejezetben előkészítem a terepet a mod_cgid és mod_fcgid modul beüzemeléséhez Apache 2.4-ben és Apache 2.2-ben.

Megosztás/Mentés

PHP telepítése Debian 6-on

Ebben a fejezetben a PHP forráskódból való telepítéséről lesz szó Debian 6-on. Több verzió telepítését mutatom be, melyek az aktuális legújabb verziói az 5.4-nek, 5.3-nak és a már elavultnak tekinthető 5.2-nek is. Ahogy az eddigi fejezetekben, itt is a forráskódból fordításra összpontosítok. Hogy miért és hogy mire lehet számítani, arról a "Bevezető" részben írok bővebben, ám befogadható rövidséggel.

Megosztás/Mentés

require és include fajtái, különbségei php-ben

Az egyik gyakran felmerülő kérdés, hogy PHP-ben mi a különbség a require, include és ezek "_once" -ra végződő verziói között. Ráadásul én is emlékszem olyan írásra, ahol valótlant is írtak. Vagy a könyv szerzője tudta, mire gondol, csak nem volt megfejthető. Erről próbálok írni és ezzel most nem vállalkozom egy nagy szakmai jelentőséggel bíró bejegyzés írására.

Alapvetően ugye mind arra való, hogy egy másik fájlra hivatkozzunk vele és az abban levő forráskódot ott hajtsuk végre, ahol hivatkoztunk rá. Mégis érezhető néha a bőség zavara. Nézzük sorjában csak a lényeget!

Megosztás/Mentés

Rekordlista-szerű tömbök fa struktúrába rendezése - Fa menüstruktúra

Gyakori feladat olyan menüket készíteni, amik fa struktúrában épülnek fel és akár egy javascript program készít belőle lenyíló menüt. Vagy akár csak egy oldaltérképre is gondolhatunk. A következő megoldásom főként azon alapszik, amikor egy adatbázisban tárolunk valamilyen adatokat. Legyen az többszintű kategória rendszer vagy menüszerkezet. Ilyenkor többnyire van egy egyedi azonosító. Amire az alárendelt rekordok hivatkoznak egy másik mezőben. Emellett persze egyéb adatokat tartalmaz a rekord. Legalább egy megjelenítendő mező is van, ami például a menü szövege. De lehet hozzá leírás is rendelve. Különböző listák lehetnek, de ami közös bennük, az a felépítés módja. Azon túl más lehet a megjelenítés. Az egyiket például egyszerű rendezetlen listában kell megjeleníteni, a másikat talán már táblázatban. A harmadikat pedig csak tabulátorokat használva. Ráadásul ha már html megjelenítésről beszélünk, ott képbe jön a css is. HTML attribútumok, osztályok. Célszerűen, lehetőleg elérhetővé téve minden elemhez egy hivatkozást, amivel egyedien lehet szükség esetén formázni akár a második menüelem 3. gyerekének 1 gyerekét. Stb... Erre mutatok egy lehetséges, ám nem mindenre kiterjedő megoldást.

Megosztás/Mentés

R.E. Login 2.0 -tól oldalak megtekintésének korlátozása és jogok (rangok).

Kérek mindenkit, akinek nem a rangokkal, oldalak megtekintésével van problémája, a következő oldalon kérdezzen:
Meghívós loginrendszer - R.E. Login v2.0

Ez a login talán a legnépszerűbb programom. De való igaz, hogy nem készítettem hozzá részletes használati útmutatót. Mivel egy komplett leírásra egyszerre nincs időm, úgy döntöttem, a leggyakrabban feltett kérdésekre válaszolok. Amik egyben a leglényegesebbek is.

Hogyan kössem regisztrációhoz egy oldal megtekintését?

Teljes oldal letiltása

Ebben a verzióban létezik egy System osztály, ami többek között tartalmaz egy protectedSite() nevű metódust. Ez a metódus mondja meg a loginnak, hogy az adott oldal védett. Tehát nem tekintheti meg akárki. Paraméter nélkül hívva csak a belépést követeli meg. És ilyenkor a config-ban beállított ( Telepítéskor megadott, vagy utólag a classes/Config.class.php -ben beállított ) főoldalra irányít át, vagy külön beállított „Védett oldal fájlja” jelzésű ( config fájlban FILE_PROTECTED_SITE konstans ) oldal esetén utóbbira..

<?php
require_once 'init.php';
System::protectedSite();
?>
Amit ide írok, azt kizárólag belépett user tekintheti meg. A többi át lesz irányítva.
Megosztás/Mentés

Szöveg első N karakterének kinyerése reguláris kifejezéssel, php-val

Az előző bejegyzésemhez hasonló megoldást mutatok, csak most nem adott számú szót vág le a függvény egy szövegből, hanem karaktereket. Szintén állítható, hogy mi kerüljön a levágott szöveg végére, ha volt mit vágni. És szintén megadható, hogy unicode szövegként legyen-e értelmezve a megadott string. Itt mégis a lényegesebb paramétere a függvénynek a 3. paraméter. Ha egy szövegben pont egy szót kéne ketté vágni, nem biztos, hogy jól mutat. Vegyük példának azt a szöveget, hogy: „Mi ez a foszfor?”. Ennek az első 11 karakterét levágva fixen elég érdekes eredményt kapnánk, ami nem biztos, hogy megengedhető. A következő függvény harmadik paraméterével szabályozható, hogy a szövegben a félbevágott szavakat be kell-e fejezni, vagy esetleg el sem kell kezdeni. Netán nyugodtan meg lehet vágni bárhol. A megoldás most is reguláris kifejezésekkel működik, bár az mb_substr függvényt is használhattam volna.

Függvény

/**
 * Szöveg első N karakterének kinyerése
 *
 * @param int $n Hány karakter kell
 * @param string $str A string, amiből az első N karakter kell.
 * @param bool $wordwrapmod Ha null, akkor szavak közben is megvághatja  szöveget.
 *                                                      Ha true, akkor befejezi a szót, aminek a közepén vágna.
 *                                                      Ha false, akkor el sem kezdi a szót, aminek a közepén vágna.
 * @param bool $unicode Unicode karaktereket is értelmezzen.
 * @param string $more Tetszőleges szöveg, jelölés, ami akkor kerül az eredmény mögé,
 *                                              ha vágni kellett belőle.
 * @return string A levágott első N karakter
 */

function firstNChar($n, $str, $wordwrapmod = null, $unicode = true, $more = ' ...')
{
        $php53 = version_compare(PHP_VERSION, '5.3') >= 0;
        $w = $php53 ? '\w' : ($unicode ? '\p{L}\p{N}' : '\w');
        $W = $php53 ? '\W' :  '^'.$w;
        $x = $b = '';
        if ($wordwrapmod) {
                $x = '(?(?=['.$w.']+)['.$w.']+)';
        } else if (!is_null($wordwrapmod)) {
                $b = '(?=['.$W.']+)';
        }
        return preg_replace('~^(?>(.{0,'.(int)$n.'})'.$b.$x.').+$~is'.($unicode ? 'u' : ''), '$1'.$more, $str);
}

Példák

$nl = '<br />'.PHP_EOL;
echo firstNChar(10, "Ez egy szöveg").$nl;
echo firstNChar(10, "Ez egy szöveg", false).$nl;
echo firstNChar(10, "Ez egy szöveg", true).$nl;
echo firstNChar(10, "Ez egy szöveg", null, false).$nl;
echo firstNChar(10, "Ez egy szöveg", null, true, ' <a href="">&raquo;</a>').$nl;

Eredmény

Ez egy szö ...<br />
Ez egy ...<br />
Ez egy szöveg<br />
Ez egy sz� ...<br />
Ez egy szö <a href="">&raquo;</a><br />
Megosztás/Mentés

Szöveg első N szavának kinyerése reguláris kifejezéssel, php-val

A következő függvény az első N darab szót tudja kinyerni egy szövegből. Figyelembe veszi, hogy bár vessző, pont, stb... után szóköz kell, ezt nem mindenki tartja be. Ha egy mondat záródik az N. szó után, akkor a mondatzáró jelet is meghagyja. Egyébként levágja. Az N. szó után, ha az eredmény nem az egész szöveget tartalmazza, tetszőleges karakterlánc kiírható. Alapértelmezetten a három pont. Be lehet kapcsolni, hogy unicode karaktereket is tartalmaz-e a szöveg, vagy sem. Alapértelmezetten true-ra van állítva.

Függvény

/**
 * Szövegből első N szó kinyerése
 *
 * @param int $n Hány szó kell a szöveg elejéről
 * @param string $str A forrás szöveg
 * @param bool $unicode Unicode karakterek lehetnek-e a szövegben.
 * @param string $more Az eredmény szöveg mögé írt karakterlánc, ha az eredmény nem a teljes szöveg.  
 * @return string
 */

function firstNWord($n, $str, $unicode = true, $more = ' ...') {
        $php53 = version_compare(PHP_VERSION, '5.3') >= 0;
        $w = $php53 ? '\w' : ($unicode ? '\p{L}\p{N}' : '\w');
        $W = $php53 ? '\W' :  '^'.$w;
       
        return preg_replace('~^(\s*['.$w.']+'.
                        str_repeat('['.$W.']+['.$w.']+', $n-1).
                        '(?(?=[?!:;.])
                                [[:punct:]]\s*
                        ))\b(.+)$~isx'
.($unicode ? 'u' : ''), '$1'.$more, $str);
}

A függvény elején levő verzió ellenőrzés azért kellett, mert 5.3 -ban már a \w is illeszkedik ékezetes karakterre.

Példák

$nl = '<br />'.PHP_EOL;
echo firstNWord(5, "Ez egy").$nl;
echo firstNWord(5, "Ez egy.").$nl;
echo firstNWord(4, "Ez egy szöveg.Amiből megtartok 4 szót.").$nl;
echo firstNWord(3, "Ez egy szöveg. Amiből megtartok 3 szót.").$nl;
echo firstNWord(5, "Ez egy szöveg,amiből megtartok 5 szót.", true,  ' <a href="#">&raquo;</a>').$nl;
echo firstNWord(5, "Ez egy szöveg,amiből megtartok 5 szót.", false,  ' <a href="#">&raquo;</a>').$nl;

Eredmény

Ez egy<br />
Ez egy.<br />
Ez egy szöveg.Amiből ...<br />
Ez egy szöveg.  ...<br />
Ez egy szöveg,amiből megtartok <a href="#">&raquo;</a><br />
Ez egy szöveg,amib <a href="#">&raquo;</a><br />

Bár a fenti példákra működik a megoldás, nem kizárt, hogy nem tökéletes.

Megosztás/Mentés