Singleton Pattern no PHP 4

Tags: , — September 11, 2008 @ 12:39 am

Já sabemos como funciona o singleton pattern no PHP 5, mas devido as capacidades limitadas de POO do PHP4, não é possível se utilizar do mesmo padrão de desenvolvimento neste, mas há um pequeno truque que podemos fazer para obter o mesmo resultado.

No PHP4 não é possível termos propriedades estáticas em classes, mas ainda é possível ter variáveis estáticas dentro de funções. Assim podemos criar uma função capaz de fazer o papel do singleton ao instanciar uma classe em um objeto estático. Veja o Exemplo:

function &singleton() {
    static $obj;
 
    if (!isset($obj)) {
        //instancia a classe, caso o objeto já não exista
        $obj = new stdclass;
    }
    return $obj;
}

No exemplo, eu usei a classe padrão stdclass do PHP, mas o mesmo funciona com qualquer classe definida pelo usuário. Você pode, inclusive, utilizar um array no lugar da variável $obj para usar a mesma função singleton para instanciar ou recuperar várias classes.

Note o operador de referência ‘&’ antes do nome da função. Ele é necessário para garantir que a função sempre retorne uma referência para o objeto estático, ao invés de criar um novo objeto, e também é necessário ao se atribuir o retorno da função a uma variável . Veja um exemplo de uso da função:

$foo =& singleton(); //cria um objeto
var_dump($foo);
 
$foo->property = 'SamuraiDio'; //atribui um valor a uma propriedade
var_dump($foo);
 
$bar =& singleton(); //recupera o objeto existe (não irá criar um novo)
var_dump($bar);

A saída do código acima, será como a seguir:

object(stdClass)(0) {
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}
object(stdClass)(1) {
  ["property"]=>
  string(10) "SamuraiDio"
}

Note que a terceira chamadas a var_dump() ainda exibe o valor da propriedade, apesar de ser de outra variável. Isso ocorre porque nossa função singleton() não instancia a classe novamente, mas sim apenas retorna uma referência para o objeto já existente. Assim temos um Singleton Pattern functional também para PHP4.

NOTA: Mesmo com a possibilidade de usar Singleton no PHP4 utiizando-se desta técnica, é altamente recomendável atualizar suas instalações para PHP5, beneficiando-se com a maior capacidade e segurança da versão.

Fontes: http://www.weberdev.com/get_example-4014.html, http://br.php.net/manual/pt_BR/language.variables.scope.php#language.variables.scope.static

LightTPD + PHP5 no Debian (Part 1: mod_fastcgi)

Tags: , , — September 7, 2008 @ 11:17 pm

Já há algum tempo tenho curiosidade de testar outros servidores http como alternativa ao nosso conhecido Apache, e um que sempre me chamou atenção é o LightTPD, com a promessa de ser mais rápido e ter um consumo bem menor de memória e recursos do sistema.

Este fim de semana resolvi finalmente me aventurar e tentar migrar do Apache para o LightTPD. Apesar de ser uma servidor web bem mais simples que o Apache, as diferenças na configuração deste podem ser uma dor de cabeça para quem está acostumado com as do Apache, principalmente em se tratando do mod_rewrite e Virtual Hosts, por isso vou separar a post em quatro partes:

  1. Instalação básica do LightTPD com mod_fastcgi e utilização com PHP5;
  2. Configuração básica de Virtual Hosts, mod_userdir, e mod_evhost, possibilitando configuraçãode virtual hosts por usuários, por exemplo;
  3. Utilização do mod_rewrite em comparação com o Apache, e configuração deste para “urls limpas” com CakePHP Framework (aplicável também para outros Frameworks e CMSs);
  4. Benchmark. Testes de performance do LightTPD em comparação com o Apache.

Começando com a Parte 1, abordada neste post.

Primeiramente instale o lighttpd, e php5-cgi, juntamente com os módulos PHP que desejar (php5-gd, php5-mysql, etc). Diferente do Apache, o Lighttpd não possui um módulo próprio para executar scripts php, assim, estes serão tratados a partir do módulo fastcgi que, na prática, é mais rápido que o apache mod_php, e não interfere em seu modo de uso.

# aptitude install lighttpd php5-cgi

Se o servidor Apache, ou outro servidor web, estiver sendo executado na porta 80, a instalação gerará um erro e ficará incompleta, pois o apt tentará iniciar o LightTPD na porta 80, que já estará sendo utilizada.

A solução para isto é parar momentaneamente o Apache (/etc/init.d/apache2 stop) , instalar o LightTPD, e alterar a sua porta, para só então reinciar o Apache (/etc/init.d/apache2 start).

Para alterar a porta utilizada pelo LightTPD, basta editar o arquivo /etc/lighttpd/lighttpd.conf e descomentar e alterar a porta, mais ou menos na linha 70: server.port = 81.

Se você não parou o servidor Apache e recebeu um erro na instalação, basta alterar a porta do lightTPD como mostrado acima, e reiniciar a instalação (basta rodar o aptitude install novamente) .

LightTPD Placeholder pageApós concluída a instalação, você deverá ver a página teste do LightTPD acessando http://127.0.0.1/ (ou http://localhost/)  no seu navegador, agora só falta ativar o suporte para PHP5.

Assim como para o Apache, a instalação padrão do LightTPD no Debian coloca as configurações do servidor web em arquivos separados. O arquivo de configuração principal do LightTPD, como já vimos, fica em /etc/lighttpd/lighttpd.conf. Configurações adicionais ficam em /etc/lighttpd/conf-available, e devem sercriados links simbólicos para estes em /etc/lighttpd/conf-enabled para que estes sejam carregados. Assim, vamos habilitar o módulo fastcgi:

# cd /etc/lighttpd/conf-enabled
# ln -s ../conf-available/10-fastcgi.conf .
#

Depois disto edite o arquivo /etc/php5/cgi/php.ini procure e altere a diretiva cgi.fix_pathinfo (linha 533, mais ou menos) de 0 para 1. Esta é uma configuração auxiliar paradar suporte as variávels PATH_INFO e PATH_TRANSLATED, que originalmente não estão disponíveis para o PHP em modo CGI (alteração necessária para alguns Frameworks, como o CakePHP, funcionarem).

Após isto basta reiniciar o LightTPD (/etc/init.d/lighttpd restart) e começar a rodar seus scripts PHP normalmente, aproveitando  o ganho de performance e a economia de memória.

<<< Previous Page