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
Następnie w php.ini należy dodać zainstalowane rozszerzenie:
extension=nazwa_rozszerzenia.so
I zrestartowac serwer.

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);
Definiujemy tablice z regułami BBCode, gdzie kluczem jest "nazwa" taga, a wartością - tablica z danymi:
  • 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
Następnie tworzymy instancję parsera za pomocą funkcji bbcode_create i parsujemy tekst za pomocą bbcode_parse. W powyższym prostym przykładzie nie wykorzystaliśmy możliwości modułu, w tym nie walidujemy zawartości pod kątem np. próby wstrzyknięcia kodu HTML. Oto nieco bardziej rozbudowany przykład:
<?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 />';
Funkcje korzystające z dodatkowych baz danych to:
<?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);
Dołączając bazę miast pełne dane lokalizacji geograficznej dostępne są za pomocą funkcji:
<?php
print_r(geoip_record_by_name($ip));
Dla niektórych miast GeoIP może mieć problem z ich rozpoznaniem i jako miasto poda nazwę kraju.

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);
}
Lista wszystkich informacji (RPMREADER_*) znajduje się w pliku rpmreader.c

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)
RkBlog

PHP w Akcji, 30 November 2008

Comment article
Comment article RkBlog main page Search RSS Contact