Tag Archives: composer

webmastering

New Composer version constraints

Topic is not 0 day news. First commits adding new version constra­ints were added on decem­ber 2014. I’ll only mention what’s new:

  • when defi­ning logi­cal AND you can use space just like you use comma, so >1.0 <=1.5 is the same as >1.0,<=1.5
  • when defi­ning logi­cal OR you should (must?) use double pipe || instead of single pipe |
  • I’m sure you know tilde opera­tor ~1.5 (which means you’re inte­re­sted in versions >=1.5,<2), new caret opera­tor ^ was intro­du­ced, ^1.2.3 defi­ni­tion means >=1.2.3,<2, so the change is you can more preci­sely define star­ting version; if you would like to define the same constra­int without caret opera­tor you would need to write ~1.2,>=1.2.3, so new opera­tor is more concise
  • the last one, hyphen opera­tor - is inclu­sive set of versions, it’s a kind of myste­rious to me, 1.0 - 2.0 is equiva­lent to >=1.0.0 <2.1 and 1.0.0 - 2.1.0 is equiva­lent to >=1.0.0 <=2.1.0 (take a look at compo­ser doc and then matcher source code)
webmastering

Wygrzebane z GitHuba (6) : Monolog

Dzisiaj o biblio­tece Mono­log, która praw­do­po­dob­nie na dobre zado­mo­wiła się w niektó­rych apli­ka­cjach PHP. Służy do gene­ro­wa­nia różnego rodzaju logów. Jest bardzo fajnie prze­my­ślana i rozsze­rzalna. Możemy sobie prak­tycz­nie wszystko usta­wić tak jak chcemy, począw­szy od nazw plików dzien­nika, przez format zapisu, aż do dodat­ko­wych infor­ma­cji załą­cza­nych do poszcze­gól­nych wpisów.

Initial commit” na GitHu­bie powstał dokład­nie 16 lutego 2011 r. Mono­log liczył sobie wtedy zale­d­wie 383 linijki kodu. Już po kilku dniach autor doko­nał poważ­nych zmian w źródłach w celu dosto­so­wa­nia struk­tury i dzia­ła­nia biblio­teki do pytho­no­wego Logbook. W czerwcu 2011 r. biblio­teka zaczyna współ­pra­co­wać z Compo­se­rem. Ostat­nim „kamie­niem milo­wym” było urucho­mie­nie ciągłej inte­gra­cji w serwi­sie Travis w listo­pa­dzie 2011 r.

Jeśli idzie o ocenę jako­ści kodu to nie mam do czego się przy­cze­pić. Biblio­teka trzyma się nazew­nic­twa PSR-0 oraz stan­dar­dów PSR-1 i 2. Można śmiało używać stan­dar­do­wego SplC­las­sLo­adera lub autoloader.php wyge­ne­ro­wa­nego przez Compo­sera. Komen­ta­rze dot. stałych, zmien­nych, klas i metod są na tyle jasne, że łatwo można się poła­pać co do czego służy i jak to rozbudować.

Podsta­wowy sposób użycia wygląda tak:

// importujemy logger i podstawowa obsluge plikow
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
 
// tworzymy obiekt logger i handler
$debugLogger = new Logger('moj_debug_logger');
 
// wybieramy plik i poziom waznosci wpisow, od ktorych beda zapisywane w dzienniku
$debugHandler = new StreamHandler(__DIR__.'/debug.log', Logger::DEBUG);
 
// umieszczamy handler w loggerze
$debugLogger->pushHandler($debugHandler);
 
// od teraz mozna umieszczac wpisy w loggerze np.
$chybaInteger = 1.0;
if (!is_integer($chybaInteger)) {
  $debugLogger->addDebug(
    'Nie podoba mi sie typ zmiennej $chybaInteger :' . gettype($chybaInteger)
  );
}

Loggery i handlery można ze sobą dowol­nie mieszać. Stwo­rzymy sobie 2 loggery: db_loggerapp_logger oraz 2 handlery: plików debug.log i powia­da­mia­jący mailem o poważ­nych błędach.

use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\NativeMailerHandler;
 
$appLogger = new Logger('app_logger');
$dbLogger = new Logger('db_logger');
 
$debugFileHandler = new StreamHandler(__DIR__.'/debug.log', Logger::DEBUG);
$appLogger->pushHandler($debugFileHandler);
$dbLogger->pushHandler($debugFileHandler);
 
$errorMailHandler = new NativeMailerHandler(
  'jakis@mail.com',
  'Powazny blad w aplikacji',
  'donotreply@moja_appka.pl',
  Logger::ERROR);
$appLogger->pushHandler($errorMailHandler);
$dbLogger->pushHandler($errorMailHandler);
 
// w pliku debug.log powstanie wpis
// [2012-07-15 12:57:46] app_logger.WARNING: Ostrzezenie [] []
// mail nie bedzie wyslany
$appLogger->addWarning('Ostrzezenie');
 
// powiedzmy, ze nie mozna polaczyc z baza danych
// blad krytyczny laduje w debug.log i zostaje wyslany mailem
$dbLogger->addAlert('Nie mozna polaczyc z baza danych');

Możemy również doda­wać infor­ma­cje dodat­kowe (tu nazy­wane Proces­sors), np. szczy­towe zuży­cie pamięci lub infor­ma­cje na temat żąda­nia HTTP za pomocą metody pushProcessor().

Jeśli jesz­cze nam mało to możemy sobie zmie­niać format zapisu logów za pomocą format­te­rów. Jeśli komu­ni­katy mają być prze­twa­rzane auto­ma­tycz­nie to pole­cam JsonFormatter.