Judy Arrays do PHP

Artigo que apresenta o Judy Array do PHP, um recurso que permite manipular arrays em PHP com mais velocidade pois é implementado de forma otimizada.

Introdução

Judy Array é uma extensão Pecl (código em C que possui interface para utilização em PHP) que implementa arrays associativos com os benefícios de escalabilidade, alta performance e eficiência no uso de memória.

Instalação da extensão Judy

Para instalar no Linux, basta instalar o pacote php-devel, baixar o Judy no site http://pecl.php.net/package/judy, extrair em algum diretório, entrar no diretório e executar os comandos abaixo:

$ phpize
$ ./configure --with-judy
$ make
$ make test
$ make install

Caso tenha dado tudo certo, edite o arquivo php.ini e, na sessão de extensões dinâmicas, inclua a linha:

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
extension=judy.so

Para checar se a extensão foi carregada, basta criar um arquivo PHP com o código seguinte:

<?php
var_dump(extension_loaded('Judy'));

Utilização de Judy Array

A extensão Judy provê uma classe chamada Judy, que implementa as interfaces ArrayAccess e Iterator. Isso significa que é uma classe que possui comportamento bastante semelhante ao de um array associativo convencional. Pode ser utilizado o operador colchetes para definir/obter valores e pode ser percorrido com a estrutura de repetição foreach (ou as funções para posicionar o cursor do array). Por algum motivo desconhecido, a classe também permite usar a função count para obter a quantidade de registros, mesmo sem implementar a interface Countable.

A diferença mais notável no uso desta classe, está no momento da criação do array. No construtor, é necessário especificar o tipo de valores associativos serão armazenados. Os possíveis valores são:

  • Judy::BITSET - Índice inteiro e valor booleano;
  • Judy::INT_TO_INT - Índice inteiro e valor inteiro;
  • Judy::INT_TO_STRING - Índice inteiro e valor string;
  • Judy::STRING_TO_INT - Índice string e valor inteiro;
  • Judy::STRING_TO_MIXED - Índice string e valor indeterminado.

Exemplo de uso:

// Criando o array indexado por string e que pode armazenar valores de qualquer tipo
$array = new Judy(Judy::STRING_TO_MIXED);

// Definindo valores em indices na forma de string
$array['a'] = 1;
$array['b'] = 'teste';
$array['c'] = 3.4;

// Imprime o conteudo da posicao 'b'
echo $array['b'].PHP_EOL;

// Percorrendo o array
foreach ($array as $chave => $valor) {
    echo $chave.' = '.$valor.PHP_EOL;
}

Alguns métodos úteis nesta classe e que não estão disponíveis para arrays convencionais são: byCount, memoryUsage e free. O primeiro método serve para obter o N-ésimo elemento (útil quando temos um array indexado por string). O segundo método serve para avaliar quanto de memória foi usada pelo array em bytes. O terceiro serve para limpar todo o array. Estes métodos estão disponíveis a partir da versão 0.1.1 do Judy. A versão pode ser checada pela função judy_version.

Observações

Esta extensão ainda está em fase beta (experimental). O uso da classe é por conta e risco do programador. Talvez você se interesse por outras classes semelhantes, como ArrayObject ou SplFixedArray.

Enquanto a extensão é beta, para instalá-la via pecl install, é necessário incluir o pos-fixo "-beta" assim:

$ pecl install Judy-beta

0 comentários