Szukaj na tym blogu

Postaram się przekazać swoje doświadczenia z PHP, oraz innych dziwnych rzeczach, typu MySQL, DB2. Czyli to co umiem. Blogoczytelników o słabych nerwach proszę o nieczytanie tego blogu. Dlaczego? Jeszcze nie wiem. W razie pytań z dziedziny PHP proszę pytać, jest cień możliwości że akurat to wiem. ;)

niedziela, 23 września 2012

Programowanie obiektowe w PHP. (cz. 3)

Programując w Javie na Androida są dostępne w klasie dwie ciekawe metody. onCreate, onDestroy. Takie cacka dostępne są też w PHP. Nazywają się __construct i __destruct. Jedna i druga zaraza jest dziedziczona. Teraz trochę z nimi zamieszam. Uwaga! Załóżmy że mamy taki malusi przykładzik.
<?php
class klasa_a {
 function __construct() {
 echo "Się skonstruowało! <br>";
 }
}
$ob = new klasa_a();
?>
Jak widać wiem co nieco o HTML'u. ;-) Mamy prostą klasę i se ją wywołujemy, pakując do zmiennej $ob, co spowodowało objawieniem się napisu. Co by utrudnić życie, zrobimy drugą klasę na podstawie tej pierwszej. Ci od Androida (ja do nich też należę) tak mają, to czemu nie w PHP. Nie można? A trzeba!
<?php
class klasa_a {
 function __construct() {
  echo "Się konstruowało!
"; } } class klasa_b extends klasa_a { } $ob = new klasa_b(); ?>
Wywołujemy klasę która jest rzekomo pusta, a tu pojawia się napis. To żaden cud, błąd, spisek, układ. Klasa b dziedziczy wszystko co ma klasa a, włącznie z konstruktorami i całym dobrodziejstwem inwentarza. Dziedzictwo oczywiście można nadpisać.
<?php
class klasa_a {
 function __construct() {
  echo "Się skonstruowało! <br>";
 }
}

class klasa_b extends klasa_a {
 function __construct() {
  echo "Dziedziczone ";
 }
}
$ob = new klasa_b();
?>
Jak widać wyświetliło się co innego, metoda została nadpisana. Ale co zrobić że w klasie a podoba mi się wpis i chcę dodać drugi w klasie b? Jest na to metoda. Zmieniamy w klasie b konstruktor tak.
function __construct() {
 echo "Dziedziczone ";
 parent::__construct();
}
Po prostu odwołujemy się do rodzica i już. Cała filozofia. w ten sposób możemy ostro namieszać w klasach, co by wrogi element z mniejszym doświadczeniem, a większymi aspiracjami se zęby połamał. Do pieca można dowalić jeszcze __destruct. Ta metoda wykonuje się kiedy skrypt jest kończony. A tak to wygląda.
<?php
class klasa_a {
 function __construct() {
  echo "się skonstruowało! <br>";
 }
}

class klasa_b extends klasa_a {
 function __construct() {
  echo "Dziedziczone ";
  parent::__construct();
 }
 function __destruct() {
  echo "To już jest koniec, nie będzie nic! <br>";
 }
}
$ob = new klasa_b();
echo "Jakaś linia co by była?!! <br>";
?>
Jak widać destruktor wykonał się na samym końcu. W brew pozorom bardzo przydatna rzecz. Można zamykać połączenie z bazą kiedy robimy to w swojej klasie, można zamykać plik, co by nie zapomnieć, a dane nie poszły se w siną dal, można dać stopkę kiedy tworzymy stronę w jakiejś zagmatwanej stronie... można zamieszać, ja tylko dałem marny przykład co by wiedzieć co w trawie piszczy.

poniedziałek, 26 marca 2012

Jak skonfigurować prosto w Apache mod_proxy?

Dość krótko. Jak włączyć modproxy? Na 99% Apache jest standardowo włączony. Jak nie wpisujemy w httpd.config:

LoadModule proxy_module modules/mod_proxy.so
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyRequests Off
Jesteśmy twardziele i sami kompilujemy Apache, czyli rzadkość wśród adminów musimy skompilować z parametrem

./configure --enable-proxy=shared
Oczywiści plus swoje parametry. Prefix, php itd...
W pliku konfiguracyjnym np w wirtualnych hostach wpisujemy:

ProxyPass /jakis_katalog http://ip:port/jakis_katalog
ProxyPassReverse /jakis_katalog http://ip:port/jakis_katalog
Dlaczego ProxyRequests Off? Jest dużo robotów wykorzystujących mod_proxy do spamowania.
Zamiast ip, może być host.
ProxyPass jest potrzebny do zmianynagłółków od klienta do serwera.
ProxyPassReverse jest potrzebny do zmiany nagłówków z serwera do klienta.
Jeszcze jedna istotna rzecz, jeżeli macie włączony SElinux i proxowany prot jest inny niż 80, np 8080, w logach pojawia się:
(13)Permission denied: proxy: HTTP: attempt to connect to 192.168.1.19:8080 (192.168.1.19) failed
Na pewno to dotyczy Fedora Linux, wiem, sam to przerabiałem niedawno.
Należy jako ROOT wpisać:

setsebool -P httpd_can_network_connect 1
Wtedy będzie na 100% działać. Powodzenia.

sobota, 24 marca 2012

Proxy balancer w Apache i jego konfiguracja

Mamy serwer z jedynym słusznym PHP, niestety sukces przerósł nas i maszyna dymi co zrobić? Postawić cztery! Jak to zrobić? Banalnie prosto.
Jednemu z czterech serwerów nadajemy mu ciężką funkcję balancera. Jeżeli jest jakieś logowanie przez HTTPS, albo inne tajne czynności, szyfruje strony tylko i wyłącznie ten serwer. Reszta serwerów o HTTPS'ie nie ma pojęcia że w ogóle takie coś jest. HTTPS zżera dość duże zasoby procesora. Tamte niech zajmują się liczeniem, kryptografia tylko balancer.
Załóżmy że nasz balancer ma IP 10.10.10.10 jako master of flamaster. Reszta od 10.10.10100 do 10.10.10.102. Nazywamy je sbn1, do sbn3 dla przykładu. Proponuje je nazwać inaczej i żeby nazwa mało co sugerowała.
W Apachu naszego balancera wpisujemy w httpd.conf, albo w jakimś naszym takie coś:

Header add Set-Cookie "IDB=.%{BALANCER_WORKER_ROUTE}e; path=/" env=BALANCER_ROUTE_CHANGED
ProxyPass / balancer://nasz_balancer/ stickysession=IDB scolonpathdelim=On nofailover=Off lbmethod=byrequests
ProxyPassReverse / balancer://nasz_balancer/
<Proxy balancer://nasz_balancer>
 BalancerMember http://10.10.10.100 route=sbn1
 BalancerMember http://10.10.10.101 route=sbn2
 BalancerMember http://10.10.10.102 route=sbn3
</Proxy>
Header add Set-Cookie jest linią bezcenną. Dodaje ciasto które może identyfikować który klient jest do którego naszego balancera, poza tym przekazuje ciastka choćby sesji PHP.
ProxyPass definiuje ruch od klienta do jednego z naszych serwerów.
ProxyPassReverse definiuje ruch z serwera do klienta. Jest to dość ważna rzecz zwłaszcza kiedy zamiast niezawodnego PHP mamy coś takiego jak Tomcat. Tomcaty charakteryzują się tym że projekt jest zawsze w jakimś katalogu. Żeby to ukryć piszemy to tak:

ProxyPass / balancer://nasz_balancer/nasz_projekt/ stickysession=IDB scolonpathdelim=On nofailover=Off lbmethod=byrequests
ProxyPassReverse / balancer://nasz_balancer/nasz_projekt/
Muszą być dwie linie, żeby nasz balancer przetłumaczył wszystkie nagłówki Apacha z http://www.naszastrona.pl/bla.html zrozumiała dla klienta, na http://10.10.10.100/nasz_projekt/bla/html zrozumiała dla Tomcata i odwrotnie.
<Proxy balancer://nasz_balancer> wpisujemy wszystkie nasze trzy serwery. BalancerMember http://ip:jak_inny_niż_80_to_podać_port route=naza_nazwa_serwera.
I.... to wszystko. Powodzenia.

piątek, 16 marca 2012

Programowanie obiektowe w PHP. (cz. 2)

Trzeba oderwać się od Javy i napisać coś o języku który lubię. Dobra. Udało zmienić się w template tytuł, na laurach nie ma co spoczywać. Trzeba zrobić coś bardziej zaawansowanego. Choćby w DIV dodać jakiś tekst, albo coś większego.
Mamy bardzo skomplikowaną stronę:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Obiektowe herezje</title>
</head>
<body>
<h1>To jest strona z tytułem</h1>
<div id="diwek"></div>
</body>
<html>
Z góry przepraszam jak w HTML'u jakimś pożrę w napadzie szału jakiś tag. Muszę go konwertować na coś wyświetlanego przez serwis, a z konwersjami różnie bywa. Ale do rzeczy. Mamy DIV, który ma swój ID. Po pierwsze przydaje się taki wynalazek, żeby grafik mógł się na pastwić w CSS'ach na konkretnym DIV, a dla nas przyda się co by mieć pewność że chodzi nam o dokładnie ten DIV a nie jakiś inny. W HTML/XHTML obowiązuje teza nieśmiertelnego „There can be only one!” i bardzo dobrze. Wrzucić tam jakiś tekst jest dość prosto. Oto i przykład:
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->validateOnParse = TRUE;
$dom->loadHTMLFile("blog.html");
$div = $dom->getElementById('diwek');
$div->nodeValue = "Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.";
echo $dom->saveHTML();
?>
Już. Działa. Gorzej jak w napadzie szału zachce się naw wstawić coś takiego:
<strong>Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.</strong>
Wyświetli się nam coś takiego:
&lt;strong&gt;Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.&lt;/strong&gt;
No jak śmiało!!! To jakaś niedorzeczność!
Otóż to jest dorzeczność. Ponieważ wartość HTML'a, XHTML'a XML'a i innego podobnego składem ela nie może mieć znaków specjalnych. Sprytny DOM żeby nie mieć problemów konwertuje znaki specjalne. Więc żeby dodać STRONG należy się ciut bardziej wysilić.
A oto wysiłek przekraczający ludzkie pojęcie:
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->validateOnParse = TRUE;
$dom->loadHTMLFile("blog.html");
$div = $dom->getElementById('diwek');
$strong = $dom->createElement('strong', 'Tu nastąpi wstawienie światłego tekstu, który oświeci ciemności, o ile nie wyłączyli prądu.');
$div->appendChild($strong);
echo $dom->saveHTML();
?>
Ale... zawsze musi być jakieś ale. Ale załóżmy że z jakiś powodów element STRONG musimy wstawić teraz, a wartość gdzieś tam daleko daleko. Żaden problem.
<?php
$dom = new DOMDocument('1.0', 'UTF-8');
$dom->validateOnParse = TRUE;
$dom->loadHTMLFile("blog.html");
$div = $dom->getElementById('diwek');
$strong = $dom->createElement('strong');
$do_daleko = $div->appendChild($strong);
// załóżmy że tu jest dużo kodu PHP, który jest niezbędny do funkcjonowania.
// bla bla bla
// i jeszcze jedna linijka dla lepszego samopoczucia!
$do_daleko->nodeValue = "A jednak wstawiłem!";
echo $dom->saveHTML();
?>
CUD! DZIAŁA!
W następnej części popastwię się nad tabelą jak ją zmajstrować i po co. ;)
Obiecuję napisać to trochę szybciej niż za pół roku. :D