Przegląd rozszerzeń z PECL
Strona pecl.php.net zawiera zbiór binarnych rozszerzeń do PHP. Część z nich to stare moduły usunięte z najnowszych wydań tego języka, lecz nie wszystkie. Znajdziemy tam szereg modułów o ciekawej i przydatnej funkcjonalności. Niestety użycie takich modułów na darmowych, czy też sporej części płatnych shared-hostingów jest niemożliwe (dość często ograniczona jest nawet lista standardowych modułów). Jest jedna z poważniejszych wad PHP, lecz jeżeli tworzymy duży projekt to nie powinniśmy brać takich ograniczeń pod uwagę. Rozszerzenia tego typu umożliwiają udostępnienie w PHP API bibliotek napisanych w C, czy C++, czy też implementują istniejące funkcjonalności wydajniej, niż wersje napisane w PHP.
Kompilacja rozszerzeń PHP jest prosta i sprowadza się do wydania poleceń:
phpize ./configure make make install
BBCode
Nie jest to może moduł oferujący złożoną funkcjonalność, ale w dość prosty sposób można zaimplementować obsługę BBCode. Zaleta tego modułu jest łatwy sposób definiowania definicji tagów, oraz wydajniejsze operowanie na łańcuchach dzięki wykorzystaniu Bstrlib. Oto prosty przykład:<?php
$arrayBBCode=array(
''=> array('type'=>BBCODE_TYPE_ROOT, 'childs'=>'!'),
'b'=> array('type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<b>', 'close_tag'=>'</b>'),
'u'=> array('type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<u>', 'close_tag'=>'</u>'),
'h'=> array('type'=>BBCODE_TYPE_ARG, 'open_tag'=>'<h{PARAM}>', 'close_tag'=>'</h{PARAM}>'),
'i'=> array('type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<i>', 'close_tag'=>'</i>'),
);
$text="[i]test[/i]
[b]Test[/b]
[u]ssss[/u]
[h=3]test[/h]
";
$BBHandler=bbcode_create($arrayBBCode);
echo bbcode_parse($BBHandler,$text);
- type - typ taga
- BBCODE_TYPE_NOARG - tag bez argumentów
- BBCODE_TYPE_ARG - tag z argumentem
- BBCODE_TYPE_OPTARG - tag z opcjonalnym argumentem
- open_tag, close_tag - określają kod HTML jaki ma być wstawiony zamiast taga otwierającego i zamykającego
- flags - określa zbiór flag, które wpływają na wynik
- param_handling - nazwa funkcji (lub metoda klasy) jaka ma być wywołana na parametrze taga
- content_handling - nazwa funkcji (lub metoda klasy) jaka ma być wywołana na zawartości taga
<?php
function bbclean_param($content, $param)
{
if (ctype_alnum($param))
{
return $param;
}
else
{
return '1';
}
}
function bbclean_content($content, $param)
{
if (ctype_alnum($content))
{
return $content;
}
else
{
return htmlentities($content);
}
}
$arrayBBCode=array(
''=> array('type'=>BBCODE_TYPE_ROOT, 'childs'=>'!'),
'b'=> array('type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<b>', 'close_tag'=>'</b>'),
'u'=> array('type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<u>', 'close_tag'=>'</u>'),
'h'=> array('type'=>BBCODE_TYPE_ARG, 'open_tag'=>'<h{PARAM}>', 'close_tag'=>'</h{PARAM}>', 'param_handling'=> 'bbclean_param', 'content_handling'=>'bbclean_content'),
'i'=> array('type'=>BBCODE_TYPE_NOARG, 'open_tag'=>'<i>', 'close_tag'=>'</i>'),
'list'=> array('type'=>BBCODE_TYPE_OPTARG,'open_tag'=>'<ol type="{PARAM}">', 'close_tag'=>'</ol>', 'default_arg'=>'1'),
'*' => array('type'=>BBCODE_TYPE_NOARG, 'flags'=>BBCODE_FLAGS_ONE_OPEN_PER_LEVEL, 'parents'=>'list', 'open_tag'=>'<li>','close_tag'=>'</li>',),
);
$text="[i]test[/i]
[b]Test[/b]
[u]ssss[/u]
[h=3]test[/h]
[h="3"]test[/h]
[h='3']test[/h]
[h=3]Test Y<textarea>[/h]
[h=><textarea>]test X[/h]
[list]
[*] aaa
[*] bbb
[/list]
";
$BBHandler=bbcode_create($arrayBBCode);
bbcode_set_flags($BBHandler,BBCODE_ARG_QUOTE_ESCAPING,BBCODE_SET_FLAGS_ADD);
echo bbcode_parse($BBHandler,$text);
Dodaliśmy funkcje wywoływane na argumencie i zawartości BBtaga "h" - uniemożliwiając wstrzyknięcie kodu HTML. Dodaliśmy także flagę "BBCODE_ARG_QUOTE_ESCAPING" dla wszystkich tagów, tak by działały w przypadku użycia cudzysłowów w argumencie. Pojawiła się także definicja listy. Tag [*] zawiera w definicji parametr parents określający BBTag rodzica, wewnątrz którego musi się znaleźć.
W pakiecie znajdziemy także katalog "test" zawierający kilkadziesiąt plików z testami różnych opcji i zachowań parsera. Zawarty tam kod może posłużyć jako przykłady możliwości modułu.
Cracklib
pecl-crack dostarcza API do biblioteki Cracklib umożliwiając sprawdzanie siły haseł. Oprócz samego rozszerzenia musimy mieć zainstalowane słowniki (zazwyczaj pod nazwą "cracklib-words").<?php
$check = crack_check('hasło');
// Pobranie wiadomości
$diag = crack_getlastmessage();
echo $diag;
GeoIP
pecl-geoip to moduł dostarczający API do biblioteki GeoIP i umożliwiający lokalizację geograficzną danego adresu IP. Istnieje także biblioteka napisana w samym PHP, lecz jest wolniejsza od rozszerzenia z PECL będącego nakładką na bibliotekę C. Oprócz samego rozszerzenia potrzebne są "bazy danych" - pliki zawierające reguły mapowania adresów IP na kraje, regiony i miasta. Podstawowe bazy danych są darmowe i publicznie dostępne. Bardziej szczegółowe są płatne. Całością bibliotek GeoIP i baz danych zarządza firma MaxMind. Listę dostępnych baz danych sprawdzimy za pomocą funkcji geoip_db_get_all_info() zwracającej tablicę z informacjami o dostępności każdej z baz danych. Mając do dyspozycji standardową bazę danych użyć możemy następujących funkcji:<?php
$ip = '149.156.124.1';
print geoip_country_code_by_name($ip).'<br />';
print geoip_country_code3_by_name($ip).'<br />';
print geoip_country_name_by_name($ip).'<br />';
<?php
print geoip_isp_by_name($ip);
print geoip_org_by_name($ip);
print geoip_id_by_name($ip);
print geoip_region_by_name($ip);
<?php
print_r(geoip_record_by_name($ip));
Tagi ID3
Tagi ID3 używane są powszechnie w plikach mp3 do przechowywania informacji o utworze (np. autor, nazwa albumu itd.). Rozszerzenie pecl-id3 pozwala odczytywać i modyfikować tagi ID3. Wraz z paczką znajdziemy kilka przykładów. Oto pobieranie wszystkich tagów ID3:<?php
echo "z pliku
";
$tag = id3_get_tag('plik.mp3');
var_dump($tag);
echo "z zasobu
";
$tag = id3_get_tag(fopen('plik.mp3', 'rb'));
var_dump($tag);
MIME i kodowanie plików
Rozszerzenie pecl-fileinfo pozwala określić typ MIME oraz kodowanie pliku przeprowadzając test liczb magicznych z danego pliku. Od PHP 5.3.0 rozszerzenie fileinfo dodano do biblioteki standardowej PHP.Informacje systemowe
Rozszerzenie pecl-Statgrab zapewnia API dla biblioteki libstatgrab. Dzięki temu rozszerzeniu możemy pobierać informacje o wykorzystaniu systemowych zasobów, aktywnych procesach, operacjach I/O na dyskach, interfejsach sieciowych, jak i inne informacje. Przegląd funkcji i zwracanych przez nich dane prezentuje poniższy kod:<?php
$functions = get_extension_funcs('statgrab');
echo "Functions available in the test extension:
";
foreach($functions as $func) {
echo $func."()
";
print_r($func());
}
echo "
";
Obsługa pakietów RPM
Rozszerzenie pecl-rpmreader pozwala czytać zawartość pakietów RPM. Oto przykład:<?php
$rpmf = rpm_open("plik.rpm");
if($rpmf)
{
print rpm_get_tag($rpmf, RPMREADER_NAME).'<br />';
print rpm_get_tag($rpmf, RPMREADER_VERSION).'<br />';
print rpm_get_tag($rpmf, RPMREADER_SUMMARY).'<br />';
print rpm_get_tag($rpmf, RPMREADER_DESCRIPTION).'<br />';
print rpm_get_tag($rpmf, RPMREADER_SIZE).'<br />';
print rpm_get_tag($rpmf, RPMREADER_DISTRIBUTION).'<br />';
rpm_close($rpmf);
}
Przesyłanie plików z śledzeniem postępu
Rozszerzenie pecl-uploadprogress pozwala na przesyłanie dużych plików wraz z obsługą śledzenia postępu. W paczce znajdziemy katalog "examples" z gotowymi skryptami.Inne rozszerzenia
W katalogu PECL znajdziemy także rozszerzenia, które są stosowane dość powszechnie, czy też stanowią zamiennik dla bibliotek napisanych w samym PHP.- pecl-memcache: API do memcache - keszowania danych w pamięci RAM. Memcache jest powszechnie stosowany w większych serwisach do keszowania wyników zapytań, czy też elementów stron.
- pecl-pdflib: jest to binarne rozszerzenie na PDFlib, bibliotekę do generowania plików PDF.
- pecl-sphinx: rozszerzenie zamiennik dla PHPowej biblioteki umożliwiającej obsługę wyszukiwarki Sphinx.
- pecl-enchant: rozszerzenie do biblioteki sprawdzania pisowni Enchant. Alternatywą jest API do biblioteki Aspell dostępne w bibliotece standardowej (funkcje pspell)
Comment article