Scriptorama.nl

Header image showing a keyboard, mouse, laptop and books on design patterns

5 interessante PECL extensies

Op Scriptorama hebben we al eerder naar PECL gekeken, maar nog niet naar wat voor handige extensies er nou precies zijn. Dat is precies wat ik vandaag doe.

Wat is PECL?

Nog even een kleine opfrisser voor wie nog niet weet wat PECL is. PECL is een repository voor extensies die zijn ontwikkeld voor PHP. Dit zijn vaak experimentele extensies, maar het is ook een plek om een extensie te laten groeien zodat deze later opgenomen kan worden in de PHP distributie, zoals dat bij PHAR gebeurd is.

PECL extensies installeren

Je kunt hiervoor op de commandline het 'pecl', script voor gebruiken:

CODE:
  1. $ pecl install memtrack

Let wel dat dit in veel gevallen niet direct zal werken omdat veel packages nog in alpha of beta fase verkeren. Als dit je irriteert, kun je PECL vragen om altijd direct beta packages te installeren:

CODE:
  1. $ pecl config-set preferred_state beta
  2. $ pecl install memtrack
  3. $ pecl config-set preferred_state stable // voor als je weer terug wilt

5 interessante extensies

Memtrack

Met deze extensie wordt het mogelijk om het geheugen gebruik van een webapplicatie enigzins te monitoren. Zo kun je een softlimit instellen waarbij er een waarschuwing wordt gegenereerd. Een andere nuttige feature is dat je bepaalde geheugenvretende functies (die je bijv. niet gemakkelijk anders kunt implementeren) kunt uitsluiten van controle, zodat je alsnog een beeld krijgt van de rest van het script.

Voorbeeld:

PHP:
  1. $a = str_repeat("scriptorama", 100000);

CODE:
  1. $ php -d memtrack.enabled=1 -d memtrack.soft_limit=10000 test.php
  2. Warning: [memtrack] [pid 19888] internal function str_repeat() executed in /home/mathieu/sor/test.php on line 3 allocated 1310720 bytes in /home/mathieu/sor/test.php on line 3

Scream

De silence operator in PHP is iets waar je voorzicht mee moet omgaan. Als je het teveel gebruikt krijg je belangrijke meldingen niet te zien terwijl als je het te weinig gebruikt te maken krijgt met vervelende warnings waar je niet zoveel mee kan.

Heb je dan als developer de silence operator netjes toegepast, zoals bijvoorbeeld bij een fopen() aanroep, dan wil je als het fout gaat toch nog wel eens weten wat er nou aan de hand was. Hiervoor is de scream extensie in het leven geroepen. Deze schakelt tijdelijk de silence-operator uit zodat je, zonder je code te veranderen, kan zien wat eventuele foutmeldingen zijn.

Voorbeeld:

PHP:
  1. $fp = @fopen("http://www.bestaatnietnee echtniet.nl/");

Wanneer we deze code runnen krijgen we geen foutmelding, maar wanneer we scream activeren wel:

PHP:
  1. ini_set('scream.enabled', true);
  2. $fp = @fopen("http://www.bestaatnietnee echtniet.nl/");

Resultaat:

CODE:
  1. $ php scream.php
  2. Warning: fopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/mathieu/sor/scream.php on line 3
  3. Warning: fopen(http://www.bestaatnietnee echtniet.nl/): failed to open stream: php_network_getaddresses: getaddrinfo failed: Name or service not known in /home/mathieu/sor/scream.php on line 3

HTTP

Sure, we hebben wel de Streams functionaliteit in PHP, maar er is meer mogelijk. Met de HTTP extensie, welke een laag op de CURL library is, krijg je een gemakkelijke API voor het samenstellen versturen van verschillende soorten HTTP requests.

Voorbeeld:

PHP:
  1. $http = new HttpRequest();
  2. $http->setURL("http://www.google.nl/");
  3. $http->send();
  4.  
  5. var_dump($http->getResponseCookies());

Geeft:

CODE:
  1. $ php -d extension=http.so http.php
  2. array(1) {
  3.   [0]=>
  4.   object(stdClass)#3 (6) {
  5.     ["cookies"]=>
  6.     array(1) {
  7.       ["PREF"]=>
  8.       string(66) "ID=ab1c234567891234:TM=1240730002:LM=1240730095:S=Ab1cdefghI23J7kL"
  9.     }
  10.     ["extras"]=>
  11.     array(0) {
  12.     }
  13.     ["flags"]=>
  14.     int(0)
  15.     ["expires"]=>
  16.     int(1303812005)
  17.     ["path"]=>
  18.     string(1) "/"
  19.     ["domain"]=>
  20.     string(10) ".google.nl"
  21.   }
  22. }

De HTTP extensie biedt een hele hoop HTTP-specifieke functionaliteit. De handleiding induiken is dus zeker even de moeite waard.

Proctitle

Gebruik je PHP soms wel eens op de commandline? Dan wil je vast ook wel eens argumenten meegeven, argumenten die niemand wat aangaan zoals een wachtwoord. Met proctitle kun je de naam van het huidige proces wijzigen om zo bijv. meegegeven wachtwoorden te beschermen.

Voorbeeld:
Wanneer we een simpel PHP script runnen met bijvoorbeeld een wachtwoord in de commandline, dan krijgen we het volgende te zien in een proces lijst:

CODE:
  1. # proctitle.php wacht op een toetsaanslag op STDIN
  2. mathieu@ubuntu:~$ ./proctitle.php -u mijngebruiker -p mijnpassword &
  3.  
  4. mathieu@ubuntu:~$ ps x
  5.   PID TTY      STAT   TIME COMMAND
  6.  8329 pts/0    S+     0:00 /usr/bin/php ./proctitle.php -u mijngebruiker -p mijnpassword

Niet de gewenste situatie, maar met proctitle zo opgelost:

PHP:
  1. $procTitleElements = $argv;
  2.  
  3. foreach ($procTitleElements as $idx => $value)
  4. {
  5.         if ($value == '-u' || $value == '-p')
  6.                 $procTitleElements[$idx + 1] = str_repeat('*', 8);
  7. }
  8.  
  9. setproctitle(join(' ', $procTitleElements));

Resultaat:

CODE:
  1. mathieu@ubuntu:~$ ps x
  2.   PID TTY      STAT   TIME COMMAND
  3.  8433 pts/0    S+     0:00 ./proctitle.php -u ******** -p ********

imagick

GD kan een hoop, maar imagemagick kan meer! Deze extensie brengt ImageMagick als OO API naar PHP. Let op, de documentatie is niet bijzonder accuraat of compleet, dus je zult wel wat moeten stoeien.

Voorbeeld:
Deze code gebruikt een foto en gebruikt de imagick::polaroidImage() functie om de foto er als een polaroid uit te laten zien. Ook wordt het formaat omgezet van JPEG naar PNG:

PHP:
  1. $draw = new ImagickDraw();
  2.  
  3. $img = new IMagick("test.jpg");
  4. $img->setImageBackgroundColor( new ImagickPixel( "black" ) );
  5.  
  6. $img->setImageFormat( "png" );
  7. $img->polaroidImage($draw, 15);
  8.  
  9. header("Content-Type: image/png");
  10. echo $img;

Resultaat:
picture-8

How about you?

Wat zijn jouw favoriete PECL extensies?

Reageer ook!

Enorme handige lijst. Vooral memtrack and ImageMagick :)

Leave a comment
Line and paragraph breaks automatic, e-mail address never displayed, HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>