Yaf: Instalação no MacOS

Ao tentar instalar o Yaf no Mac (10.8.2) tive o seguinte problema ao usar o pecl:

Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
 
ERROR: `phpize' failed

Então fui atras para saber o que era e descobri que estava sem o ‘autoconf’. Para resolver esse problema, utilizei o ‘brew’:

brew install autoconf

Feito isso, consegui rodar então o pecl para instalar o Yaf e após a instalação do pacote, bastou incluir “extension=yaf.so” ao php.ini.

Testes com Raspberry Pi

Olá amigos. Depois das férias de janeiro estou de volta aqui para dar continuidade aos meus projetos. Nesse período de férias chegou minha Raspberry Pi, fiz alguns testes com ela e me surpreendi com o tanto de coisa que consegui colocar para rodar nela.

Serviços instalados:
- Xbian (xbmc para raspberry pi)
- nginx
- php 5.4
- WebIDE
- nagios
- sqlite
- gsm-utils library
- transmission (torrent)

Agora falta fazer a integração do meu projeto de automação residencial usando arduino com a interface web do raspberry pi. Conforme for fazendo, irei postando aqui o projeto e os códigos.

Segue algumas imagens da execução:

Continuidade do blog..

Boa tarde amigos, sei que deixei o blog abandonado desde o dia 21/novembro, mas como estava na correria de final de semestre da facul, não tive tempo para tocar meus projetos nem para postar aqui, pois como teve greve na UFSC, as aulas terminaram ontem (21/dezembro). Agora estou saindo de férias do serviço também e volto apenas dia 7/janeiro para dar continuidade nos trabalhos.

O que tenho em andamento:
- Projeto automação residencial utilizando Arduino;
- Projeto para CMS em PHP utilizando o YAF;
- Participando de projetos do Tarrafa – Hackerspace Florianópolis;

Então conteúdo para postar não irá faltar, basta ter tempo para tocar isso.

Agradeço a compreensão e boas festas! :)

Validação arquivos PHP no CVS

Com o alto número de desenvolvedores, correria do dia-a-dia para resolução de bugs e necessidade de enviar arquivos frequentemente para os servidores de produção, inicialmente criei um script para validar se os arquivos PHP não estão com erro de sintaxe, para evitar problemas maiores e erros no repositório.

No CVS, faça checkout do CVSROOT e adicione ao arquivo “commitinfo” a seguinte linha:

ALL        /bin/bash $CVSROOT/CVSROOT/pre_commit

Feito isso, no diretório CVSROOT dentro do seu repositório CVS, no meu caso “/cvs/CVSROOT”, crie o arquivo “pre_commit”:

#!/bin/bash
DIR=$1
FILES=(`echo ${@:2} | sed -e 's/ /\n/g'`)
SYNTAX_RE='No syntax errors*'
 
for line in "${FILES[@]}"
do
  	args=(`echo $line | sed -e 's/,/\n/g'`)
        ext=(`echo ${args[0]} | sed -e 's/\./\n/g'`)
        if [ "${ext[${#ext[@]}-1]}" == "php" ]; then
                PHPTEST=`/bin/php -l ${args[0]}`
                if [[ "$PHPTEST" != $SYNTAX_RE ]]; then
                        exit 1
                fi
        fi
done

Obs.: Altere o ‘/bin/php’ para o caminho onde está instalado o seu PHP, caso não saiba é só executar ‘which php’ e pegar o caminho completo da instalação.

Pronto, feito isso é só fazer commit do seu arquivo ‘commitinfo’ que não irá mais entrar arquivo com erro de sintaxe no seu repositório.

PHP 5.5.0 Alpha1 liberado!!

Na última quinta-feira, 15 de novembro, a equipe de desenvolvimento do PHP liberou o PHP 5.5.0alpha1. Este lançamento marca o início da versão 5.5.0 e todos os desenvolvedores já podem começar a testar esta versão tomando as devidas precauções, relatando quaisquer bugs no PHP bug tracking system, lembrando que este é um preview de desenvolvimento e jamais deve ser utilizado em produção.

PHP 5.5.0 Alpha 1 vem com novas funcionalidades, tais como (lista incompleta):

  • Suporte para Generators
  • Nova API para hash de senha
  • Suporte para finnaly em blocos try/catch
  • Suporte para list() no foreach
  • Constante array/string com ‘dereferencing’
  • Melhoria no ext/intl
  • Removido suporte para Windows XP e 2003.

Lista completa de mudanças no arquivo de lançamento.

Para download dos arquivos fonte do PHP 5.5.0 Alpha 1 visite a página de download.

Fonte: http://php.net/

Yaf: Benchmark

Após analisar vários frameworks, fazer alguns testes e benchmarks, pude constatar que hoje em dia não existe nenhum framework para PHP mais rápido que o Yaf.

Seguem os benchmarks que foram feitos pelo Laruence (desenvolvedor do Yaf):

Hardware
CPU: Intel Core i5 750 (2.67GHz x4)
RAM: 4GB

Software
Debian 6.0.3 x86_64 (2.6.32-39)
apache 2.2.16 (mpm-prefork,mod-php5)
php 5.3.8
php-apc 3.1.9 (Optimization for include/require)
Copy all projects to /dev/shm/* (Optimization for files read/write)

Apache Benchmark
Requisições por segundo (-c 100 -n 30000), quanto maior melhor.

Requisições por segundo (-c 200 -n 50000), quanto maior melhor.

System LoadAvg
Carga média do sistema em 1 minuto, quanto menor melhor (-c 100 -n 30000)

Memória
Consumo de memória para exir uma págine de “Hello World”, quanto menor melhor.

Tempo de resposta
Tempo para uma requisição de página responder.

Chamadas de funções
Número de funções para exibir uma página “Hello World”. Quanto menor melhor

Arquivos incluídos
Número de arquivos incluidos ou requisitados para exibir uma página “Hello World”. Quanto menor melhor.

E depois de algumas discussões sobre o Phalcon (outro framework PHP que roda como extensão), que chegou se dizendo o Framework mais rápido do mercado, o desenvolvedor do Yaf fez um Benchmark para provar que o Yaf continuava sendo o mais rápido, e então postou isso em seu blog, segue:

Hardware
8 * Intel(R) Xeon(R) CPU E5620 @ 2.40GHz
MemTotal: 12296092 kB
Apache 2.2
PHP 5.4.7 with APC-3.1.13

Resultado
ab -n 30000 -c 100

Isso tudo está de acordo com os meus benchmarks realizados aqui, por isso utilizei as imagens do Laruence.

GitHub: Projeto YafCMS

Olá, estou aqui hoje para falar que acabei de fazer o primeiro commit para o GitHub do projeto YafCMS. O objetivo deste projeto é fazer um CMS de alto desempenho baseado no Yaf. Por enquanto não tem nada de concreto publicado, apenas publiquei para quem tiver interesse em ser colaborador poder entrar em contato comigo que estou organizando o que irá em cada versão do projeto.

O que ele tem por enquanto:
- Doctrine
- Remote Debug System
- Globo.com Bootstrap (baseado no Twitter Bootstrap)
- Classes auxiliares de Helper, Inflect, Request, Loader.

Projeto: https://github.com/lucasrosa90/Yaf-CMS

Ainda estou estudando sobre o uso ou não do Doctrine, caso alguém tenha sugestão favor colocar aqui nos comentários :)

Yaf: Criando primeira aplicação

Após falar um pouco do Yaf e mostrar como instalar e configurar, vamos ao que interessa, vamos programar!

Como já falado anteriormente, a estrutura das aplicações Yaf são bem similares as do ZendFramework, mas mostrarei passo-a-passo como fazer.

1º passo: Criar a estrutura de arquivos e diretórios:

  • application
    • configs
      • application.ini
    • controllers
      • Error.php
      • Index.php
    • models
    • plugins
    • views
      • error
        • error.phtml
      • index
        • index.phtml
    • Bootstrap.php
  • library (Instalar as bibliotecas locais da sua aplicação)
    • Zend
    • Doctrine
    • Symfony
    • Smarty
    • (…)
  • public
    • css
    • img
    • js
    • index.php

2º passo: Criar o arquivo de configuração
application/configs/application.ini

[yaf]
; Diretório da aplicação.
application.directory = APPLICATION_PATH
 
; Extensão dos arquivos PHP, utilizado para o autoloader (Yaf_Loader).
application.ext = "php"
 
; Extensão dos arquivos de view.
application.view.ext = "phtml"
 
; Lista de módulos registrados para serem utilizados no roteamento.
; Yaf precisa saber se o primeiro parâmetro do PATH_INFO é um módulo ou não.
application.modules 
 
; Diretório das bibliotecas locais
application.library = LIBRARY_PATH
 
; Caminho para o arquivo do Bootstrap
application.bootstrap = APPLICATION_PATH "/Bootstrap.php"
 
; Utilizado para remover prefixos fixos das URL. Por exemplo "/prefix/controller/action". se você setar application.baseUri para "/prefix", então apenas "/controller/action" será passado no PATH_INFO.
application.baseUri =
 
; Rota padrão, se não especificada, utilizará a rota padrão
application.dispatcher.defaultRoute =
 
; Módulo padrão
application.dispatcher.defaultModule = "index"
 
; Controlador padrão
application.dispatcher.defaultController = "index"
 
; Ação padrão
application.dispatcher.defaultAction = "index"
 
[development : yaf]
; Se estiver On, Yaf irá mostrar as exceções que derem erro. Yaf_Dispatcher::throwException().
application.dispatcher.throwException = On
 
; Se estiver On, Yaf irá passar para o controlador de erro quando ocorrer uma exceção não tratada. Yaf_Dispatcher::catchException().
application.dispatcher.catchException = On
 
[product : yaf]
; Se estiver On, Yaf irá mostrar as exceções que derem erro. Yaf_Dispatcher::throwException().
application.dispatcher.throwException = Off
 
; Se estiver On, Yaf irá passar para o controlador de erro quando ocorrer uma exceção não tratada. Yaf_Dispatcher::catchException().
application.dispatcher.catchException = Off

3º passo: Criar o Bootstrap
application/Bootstrap.php

<?php
class Bootstrap extends Yaf\Bootstrap_Abstract
{
	/* Todos os métodos declarados no bootstrap que começem com "_init"
	   serão chamados pelo Yaf\Application::bootstrap() na ordem que
	   foram declarados */
}

4º passo: Criar os controladores
application/controllers/Error.php

<?php 
class ErrorController extends \Yaf\Controller_Abstract
{
	public function errorAction($exception)
	{
		switch ($exception->getCode()) {
			case YAF\ERR\AUTOLOAD_FAILED:
			case YAF\ERR\NOTFOUND\MODULE:
			case YAF\ERR\NOTFOUND\CONTROLLER:
			case YAF\ERR\NOTFOUND\ACTION:
				header('HTTP/1.0 404 Not Found');
				break;
			default:
				header("HTTP/1.0 500 Internal Server Error");
				break;
		}
 
		$this->_view->e = $exception;
		$this->_view->e_class = get_class($exception);
		$this->_view->e_string_trace = $exception->getTraceAsString();
 
		$params = $this->getRequest()->getParams();
		unset($params['exception']);
		$this->_view->params = array_merge(
			array(),
			$params,
			$this->getRequest()->getPost(),
			$this->getRequest()->getQuery()
		);
	}
}

application/controllers/Index.php

<?php 
class IndexController extends Yaf\Controller_Abstract
{
	public function indexAction()
	{
		$this->_view->content = 'Hello World!';
	}
}

5º passo: Criar as views
application/views/error/error.phtml

<html xmlns="http://www.w3.org/1999/xhtml">
	<head>
		<title><?php echo $e->getMessage() ?></title>
		<style>
			body { background-color: #fff; color: #333; }
			body, p, ol, ul, td {
				font-family: verdana, arial, helvetica, sans-serif;
				font-size: 13px;
				line-height: 18px;
				background-color: #fdfdfd;
			}
			h1,h2,h3,h4 {
				color: #000066;
			}
			pre {
				border: 2px solid #ccc; 
				background-color: #eeeeff;
				padding: 10px;
				font-size: 11px;
			}
			span.file { color: #00B;}
			span.line { color: #070;}
			span.exception {text-decoration: underline; color: #dd0000;}
			.strong{ font-weight: bold;}
			a { color: #000099; }
			a:visited { color: #666; }
			a:hover { color: #000099; text-decoration: none; }
		</style>
	</head>
	<body>
		<h1><?php echo $e_class ?></h1>
		<pre class="strong"><span class="exception"><?php echo  $e_class; ?></span>: <span class="message"><?php echo $e->getMessage()?></span> in file <span class="file"><?php echo $e->getFile()?></span> at line <span class="line"><?php echo $e->getLine()?></span></pre>
		<div id="traces">
			<h2>Exception Trace</h2>
			<pre><code><?php echo $e->getTraceAsString()?></code></pre>
			<h2>Debug Backtrace</h2>
			<pre><code><?php debug_print_backtrace(); ?></code></pre>
		</div>
		<h2 style="margin-top: 30px;">Request</h2>
		<p>
			<b>Parameters: </b>
			<pre><?php print_r($params) ?></pre>
		</p>
	</body>
</html>

application/views/index/index.phtml

<h1><?php echo $this->content; ?></h1>

6º passo: Criar o inicializador da aplicação
public/index.php

<?php
define("BASE_PATH", realpath(dirname(__FILE__) . "/../"));
define("APPLICATION_PATH", realpath(dirname(__FILE__) . "/../application/"));
define("LIBRARY_PATH", realpath(dirname(__FILE__) . "/../library/"));
define("PUBLIC_PATH", realpath(dirname(__FILE__)));
define("DS", '/');
 
$app = new Yaf\Application( APPLICATION_PATH . "/configs/application.ini" );
$app->bootstrap()->run();

Feito isso, sua árvore de arquivos ficará assim:

Rodando esse teste no navegador, já teremos o nosso “Hello World” feito com Yaf.

Capturando no ‘public/index.php‘ o uso total de memória e o tempo de processamento da aplicação, obtive os seguintes resultados:

  • Inicio da aplicação: Memória: 622.16Kb, Tempo: 0.20604s
  • Final da aplicação: Memória: 677.18Kb, Tempo: 0.20664s
  • Total gasto: Memória: 55.02Kb, Tempo: 0.00059s

Só para fazer uma rápida comparação, fiz o mesmo exemplo utilizando Zend Framework e observem o consumo de memória muito maior:

  • Inicio da aplicação: Memória: 623.23Kb, Tempo: 0.53993s
  • Final da aplicação: Memória: 4.28Mb, Tempo: 0.56212s
  • Total gasto: Memória: 3.67Mb, Tempo: 0.02219s

Downloads:

Yaf: Instalação e configuração

A instalação e configuração do Yaf é bem simples e pode ser feita diretamente pelo PECL. Neste post irei mostrar passo-a-passo como configurar seu servidor para rodar o Yaf.

Requisitos:

  • PHP 5 >= 5.2.1

Instalação:

  • PECL:
    • pecl install yaf
  • Código fonte:

    • wget http://pecl.php.net/get/yaf
    • tar -zxvf yaf
    • cd yaf
    • phpize
    • ./configure
    • make
    • make install

Configurando o servidor:
php.ini

; Biblioteca global, Yaf_loader irá procurar bibliotecas globais neste diretório.
yaf.library =
 
; Se for passado apenas uma parte no PATH_INFO, deve ser considerado o controller ou a action.
; Se for configurado On, irá considerar o nome da action.
yaf.action_prefer = Off
 
; Configurar se será irá considerar maiusculo/minusculo nos nome dos diretórios durante o carregamento automático de classes.
yaf.lowcase_path = Off
 
; Quando estiver On, se o Yaf_Loader não encontrar a classe, irá retornar FALSE, para que outro autoloader possa ser chamado.
; Quando estiver Off(default), Yaf_Loader::autoload() irá sempre retornar TRUE.
yaf.use_spl_autoload = Off
 
; Quando estiver On, Yaf_Loader irá identificar a classe pelo sufixo para identificar se pertence a sua estrutura de diretórios.
; Quando estiver Off, Yaf_Loader irá identificar a classe pelo prefixo.
yaf.name_suffix = On
 
; Quando estiver setado, Yaf_Loader irá identificar o sufixo pelo separador.
; Por exemplo, quando o velor for "_", Yaf_Loader irá identificar Index_Controller como o a classe do controlador.
yaf.name_separator =
 
; Quando estiver On, e você estiver utilizando o arquivo 'ini' para configuração da aplicação, o arquivo irá ficar no cache do processo PHP.
yaf.cache_config = Off
 
; Parametro utilizado para buscar a sessão de configuração
yaf.environ = product
 
; Funciona apenas no PHP 5 >= 5.3, se estiver On, todas as classes do Yaf serão chamadas pelo namespace.
; Por exemplo, Yaf_Route_Rewrite => \Yaf\Route\Rewrite, Yaf_Controller_Abstract => \Yaf\Controller_Abstract
; Abstract é uma keyword, e não pode ser utilizada como nome de classe
yaf.use_namespace = On

Apache

RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule .* index.php

Nginx

server {
	listen ****;
	server_name  domain.com;
	root   document_root;
	index  index.php index.html index.htm;
 
	if (!-e $request_filename) {
		rewrite ^/(.*)  /index.php/$1 last;
	}
}

Lighttpd

$HTTP["host"] =~ "(www.)?domain.com$" {
	url.rewrite = (
		"^/(.+)/?$"  => "/index.php/$1",
	)
}

Após fazer as configurações basta reiniciar os serviços. A verificação se o YAF está instalado e configurado corretamente pode ser feita com o phpinfo().

Feito isso, agora é só começar a programar sua aplicação no mais rápido framework que existe para PHP.

Yaf (Yet Another Framework) – Framework PHP rodando como extensão

O YAF é um framework muito parecido com o Zend Framework, mas que foi desenvolvido em C para rodar como extensão do PHP. E por ser uma extensão do PHP, ele tem um desempenho muito melhor que os outros frameworks.

Estou desenvolvendo um CMS OpenSource com o Yaf, portanto irei fazer vários posts relacionados a esse framework. Irei abordar assuntos como: instalação, configuração, benchmarks, testes, dificuldades encontradas, entre outros.

Com relação ao CMS, ainda não terminei a base dele, portanto ainda não fiz nenhum commit ao GitHub, mas em 1 ou 2 semanas pretendo já disponibilizar a primeira versão.