Mostrando postagens com marcador dicas. Mostrar todas as postagens
Mostrando postagens com marcador dicas. Mostrar todas as postagens

18 julho 2010

5 dicas para Certificação Zend PHP 5

Após quase um ano da compra do voucher, eu (Otávio Calaça) finalmente tive tempo para poder fazer a tão temida prova da Zend PHP 5 Certification. Para minha surpresa e felicidade, consegui passar e agora posso ser chamado de Zend Certified Engineer... rsrs. Como é sempre bom ver a comunidade PHP crescer e se profissionalizar, aqui vão 5 dicas para quem está estudando ou pretende ser um ZCE:


  • Compre os testes oferecidos pela Zend. Os testes foram muito importantes nos meus estudos para avaliar quais eram os meus pontos fortes e fracos. A partir deles, por exemplo, descobri que precisava estudar mais sobre sockets e streams. Entretanto, a Zend só oferece um pacote com 10 testes. Para o estudo, não são necessários mais do que 5 testes. Então, o ideal é dividir os testes com algum amigo também interessado em fazer a prova. Só faça a prova quando tiver excellent em quase todos os itens do teste.


  • Estude o Zend PHP 5 Certification Study Guide por completo, mas não somente ele. O guia para certificação PHP 5 é muito bom para saber o que pode cair na prova. Entretanto, considero-o insuficiente. Estude também pelo manual do PHP, principalmente as funções de array, string e streams. Uma coisa chata que caiu, mesmo que indiretamente, foi a ordem de parâmetros em funções.


  • Não estude apenas PHP. Apesar de a certificação ser de PHP, é de engenheiro. Isso significa que cai questões sobre bancos de dados, sistemas operacionais, servidores web, protocolos, projeto e segurança. Os bancos de dados que caíram para mim foram MySQL, SQLite e PostgreSQL. Entretanto, cai questões genéricas sobre SQL, DDL e segurança em DB. Em relação a servidores, caíram algumas questões sobre configuração do apache, sobre o protocolo HTTP e SSL. Padrões de projeto é uma parte delicada. Os que caíram nos testes e na prova foram os que estão no guia. Entretanto, é necessário consultar outras fontes. Um bom livro de design patterns é o PHP objects, patterns, and practice por Matt Zandstra. Para segurança, creio que o TOP 10 da OWASP seja suficiente.


  • Ter inglês de intermediário pra cima. Uma das coisas que pesou em algumas questões de enunciado mais complexo foi o conhecimento da língua inglesa. A Person Vue disponibiliza o teste em outras línguas (português não). Entretanto, creio que o inglês seja a melhor delas.


  • Tenha calma e não estude até horas antes da prova. Ficar nervoso ou ansioso só complica as ideias. Como em qualquer prova, não estude até o último momento, reserve um ou dois dias antes da prova para descansar.



Antes da prova eu fiz 3 testes, porem só guardei o primeiro e o último. O primeiro eu fiz antes de estudar, para ver como estava meu conhecimento. Notei que haviam 6 tópicos que eu precisava estudar.No último consegui melhorar 2 itens, entretanto continuei levando fail em design. Provavelmente pelas questões subjetivas, que são mais comuns no tema design.
Espero que essas dicas possam ajudar vocês e boa sorte!

19 fevereiro 2009

Trabalhando com Lobs, Blobs, Clobs do Oracle no PHP

Trabalhar tipos de dados como Varchar2 no Oracle é bastante simples, mas e se for necessário armazenar uma informação que tenha mais de 4000 caracteres?
Para esses casos a solução é um dos tipos LOB(Oracle Long Object), que necessitam um tratamento especial com a utilização da API do PHP para trabalhar com Lobs.

Objetos Long no Oracle
O Oracle fornece os seguintes tipos de dados LOB:
- BLOB, utilizado para armazenar informações binárias
- CLOB, utilizado para armazenar caracteres com a codificação do banco de dados
- NCLOB, utilizado para armazenar informações com codificação UNICODE. Deve-se observar que NCLOBs, atualmente não são suportados pela extensão OCI8 do PHP, que será explicada neste artigo.
- BFILE, utilizado para referenciar arquivos externos do sistema operacional.

Uma subcategoria dos LOBs, são os LOBs temporários, que podem ser tanto um BLOB, quanto um CLOB ou NCLOB, com a diferença que são armazenados temporariamente na seção até você limpar a memória.
Obs.: As versões mais antigas do Oracle fornecem os tipos LONG e LONG RAW, para caracteres e binários respectivamente. Com o Oracle9i, esses tipos ficaram depreciados em favor dos LOBs.


Armazenamento permitido em um LOB
Para os tipos BLOB, CLOB e NCLOB, o Oracle Database 10g é capaz de armazenar até 128TB em um único registro, dependendo das configurações do banco.

Um objeto LOB compreende dois elementos: O conteúdo do LOB e o localizador do LOB, que é um ponteiro para o conteúdo do LOB. Essa separação é necessária para permitir que o Oracle armazene e gerencie os LOBs de maneira eficiente, e isso é refletido na API do PHP, ao realizar consultas nos LOBs.
Para os tipos internos de LOBs(exceto BFILEs), o Oracle irá armazenar o conteúdo na linha dentro da tabela, juntamente com o restante do registro, em LOBs que tem como tamanho menos de 4KB.
Para LOBs com mais de 4KB, as informações são gravadas fora da tabela. Essa medida permite que os registros pequenos de LOBs sejam trabalhados mais rapidamente do que os maiores, que são armazenados em um local separado, e por isso tem um tempo de acesso mais lento.

Há outras opções para o armazenamento e acesso de LOBs - como utilização de cache e buffer -, que pode fazer com que a performance seja aumentada. Para maiores informações veja o Guia de Performance de LOBs.

Restrições em LOBs
Há algumas restrições que se aplicam ao trabalhar com LOBs, as mais importante estão no seu uso nas consultas SQL.
Não é possível utilizar LOB em nenhuma das seguintes consultas:

SELECT DISTINCT
ORDER BY
GROUP BY

Também não é possível utilizar LOBs em junções de tabelas(JOIN), UNION, INTERSECTION e MINUS.
Há ainda outras restrições como não ser possível utilizar um LOB como chave primária de uma tabela. Para maiores informações, veja o Guia do Desenvolvedor de Aplicações Oracle - Large Objects

CLOBs e codificações
A codificação padrão de uma base de dados é determinada com o parâmetro NLS_CHARACTERSET, e um texto em um CLOB utiliza o mesmo tipo de codificação determinado nesse parâmetro.
Para visualizar o tipo de codificação utilizado em uma case de dados, deve-se utilizar o seguinte SQL.

SELECT value FROM nls_database_parameters WHERE parameter = 'NLS_CHARACTERSET'

Para alterar a codificação de uma base utilize:

ALTER DATABASE CHARACTER SET UTF8

Obs.: Cuidado ao realizar essa operação, principalmente se houver informações na base, ou se a aplicação utilizar outro tipo de codificação.

Trabalhando com LOBs
As explicações seguintes focam na extensão OCI8 do PHP. É bom lembrar que o Oracle fornece um pacote chamado DBMS_LOB, que contém funções para trabalhar com LOBs utilizando PL/SQL.

A extensão OCI8 registra uma classe chamada OCI-Lob no escopo global da aplicação. Quando se executa uma consulta do tipo SELECT por exemplo, onde uma das colunas for um tipo LOB, o PHP vai automaticamente transformar esse campo em um objeto OCI-Lob. Assim que houver uma referencia a esse objeto, será possível chamar métodos como load() e save(), para acessar ou modificar o conteúdo do LOB.
Os métodos disponíveis dependem da versão da PHP que está sendo utilizada. O PHP 5 provê métodos como read(), seek() e append(). Para visualizar os métodos disponíveis, utilize o script abaixo.




No PHP 5.0.5, os seguintes métodos são retornados:
OCI-Lob::load()
OCI-Lob::tell()
OCI-Lob::truncate()
OCI-Lob::erase()
OCI-Lob::flush()
OCI-Lob::setbuffering()
OCI-Lob::getbuffering()
OCI-Lob::rewind()
OCI-Lob::read()
OCI-Lob::eof()
OCI-Lob::seek()
OCI-Lob::write()
OCI-Lob::append()
OCI-Lob::size()
OCI-Lob::writetofile()
OCI-Lob::writetemporary()
OCI-Lob::close()
OCI-Lob::save()
OCI-Lob::savefile()
OCI-Lob::free()

Na prática, a extensão OCI8 do PHP 4.x permite a leitura e escrita de LOBs completos somente, que são os usos mais comuns em aplicações Web. O PHP5 extende essas funcionalidades, permitindo que sejam lidos ou gravados pedaços de um LOB, assim como a utilização de buffer com os métodos setBuffering() e getBuffering().
O PHP5 ainda disponibiliza as funções oci_lob_id_equal() e oci_lob_copy().

Os exemplos abaixo utilizam a nova nomenclatura das funções OCI para PHP5. No PHP5 há o caracter underline entre as palavras. Ex.: PHP4 - ociparse(), PHP5: oci_parse().
Nos exemplos será utilizada a sequência e a tabela abaixo:


CREATE SEQUENCE mylobs_id_seq
NOMINVALUE
NOMAXVALUE
NOCYCLE
CACHE 20
NOORDER
INCREMENT BY 1;

CREATE TABLE mylobs (
id NUMBER PRIMARY KEY,
mylob CLOB
)


Na maioria dos exemplos, serão utilizados CLOBs, mas a mesma lógica pode ser aplicada aos BLOBs.

Inserindo um LOB
Para inserir um LOB, antes de mais nada, é necessário inicializar o campo LOB com as funções empty_blob ou empty_clob do Oracle - Não é possível atualizar uma informação em um LOB que contenha um valor NULL.
Uma vez inicializado, é necessário vincular a coluna a um objeto OCI-Lob do PHP e atualizar o conteúdo do LOB através do método save() do objeto.

O seguinte script fornece um exemplo, retornando o campo LOB da consulta INSERT:
save('INSERT: '.date('H:i:s',time())) ) {

// Se houver erro a transação é cancelada
oci_rollback($conn);

} else {

// Se não houver erro a transação é confirmada
oci_commit($conn);

}

// Libera recursos
oci_free_statement($stmt);
$myLOB->free();


// desconecta do banco, etc...
?>

Perceba que esse exemplo utiliza transação, chamando o método oci_execute com a constante OCI_DEFAULT, o que faz com que a alteração no banco somente seja realizada após oci_commit ou oci_rollback.
Isso é importante, pois há dois estágios na inserção. O primeiro cria o registro e o segundo atualiza o conteúdo do LOB.

Se fosse utilizado um campo BLOB, a única mudança necessária seria na chamada ao método oci_bind_by_name:
oci_bind_by_name($stmt, ":mylob_loc", $myLOB, -1, OCI_B_BLOB);

Há uma maneira de vincular um campo LOB sem especificar seu tipo:



Essa maneira simplifica o código significativamente e é adequado quando há a necessidade de escrever um LOB relativamente pequeno. Se for necessário escrever um LOB extenso, é possível nevegar pelo conteúdo chamando as funções write() e flush() para escrever pequenos pedaços de cada vez e não sobrecarregar a memória.

Retornando um LOB
Quando uma consulta SELECT contém uma coluna LOB, o PHP irá automaticamente vincular a coluna com um objeto OCI-Lob. Por exemplo:

load()."\n";
}

// etc.
?>


Esse processo pode ser simplificado com a utilização da constante OCI_RETURN_LOBS na chamada ao método oci_fetch_arrray(), instruindo a substituição dos objetos LOB por seus valores:


while ( $row = oci_fetch_array($stmt, OCI_ASSOC+OCI_RETURN_LOBS) ) {
print "ID: {$row['ID']}, {$row['MYLOB']}\n";
}


Atualizando um LOB
Para atualizar o conteúdo de um LOB, é possível utilizar o comando RETURNING da mesma maneira que na inserção, mas há uma maneira mais simples, que é utilizar a sintaxe SELECT ... FOR UPDATE

truncate() ) {
oci_rollback($conn);
die ("Failed to truncate LOB\n");
}

// Salva o novo valor no campo LOB
if ( !$row['MYLOB']->save('UPDATE: '.date('H:i:s',time()) ) ) {

// Se houver erro a transação é cancelada
oci_rollback($conn);

} else {

// Se não houver erro a transação é confirmada
oci_commit($conn);

}

// Libera recursos
oci_free_statement($stmt);
$row['MYLOB']->free();
?>



Da mesma maneira que no INSERT, é necessário realizar o UPDATE utilizando uma transação. Um passo importante é chamar o método truncate(). Ao atualizar um LOB com save(), ele irá substituir o conteúdo do início do LOB até o tamanho da nova informação.
Isso significa que o conteúdo anterior(se for maior que o novo), poderá continuar no campo LOB.

No PHP 4.x, onde o método truncate() não está disponível, a alternativa é utilizar o método empty_clob() do Oracle para apagar qualquer conteúdo do LOB antes de salvar a nova informação.


save( 'UPDATE: '.date('H:i:s',time()) ) ) {

OCIRollback($conn);
die("Unable to update lob\n");

}

OCICommit($conn);
$mylob->free();
OCIFreeStatement($stmt);

?>


Trabalhando com BFILES
Ao utilizar o tipo BFILE, as consultas INSERT e UPDATE dizem ao Oracle qual a localização do arquivo no sistema de arquivos do servidor(Que pode não ser o mesmo do servidor Web), ao invés de passar o conteúdo do arquivo. Utilizando uma consulta SELECT, é possível ler o conteúdo de um BFILE através do Oracle, ou chamar as funções do pacote DBMS_LOB para buscar informações do arquivo.

O maior benefício dos campos BFILEs é a possibilidade de acessar o arquivo original diretamente do sistema de arquivos e ainda conseguir localizar arquivos via SQL. Isso significa que, por exemplo, imagens podem ser exibidas diretamente do sistema de arquivos enquanto é possível acompanhar o relacionamento entre a tabela contendo o BFILE e uma tabela de usuários que guarda quem fez o upload.

Como um exemplo, primeiramente é preciso atualizar a tabela utilizada nos exemplos anteriores.

ALTER TABLE mylobs ADD( mybfile BFILE )

Após isso é necessário registrar um atalho para um diretório no Oracle e dar permissões de leitura a este.
CREATE DIRECTORY IMAGES_DIR AS '/home/public_html/images'
GRANT READ ON DIRECTORY IMAGES_DIR TO usuario_do_banco

Agora é possível inserir BFILEs com:



Se for necessário, é possível ler o conteúdo de um BFILE através do Oracle utilizando a mesma maneira realizada com os CLOBs. Alternativamente, se for necessário buscar o nome dos arquivos, é possível acessar diretamente do sistema de arquivos, utilizando uma chamada à função DBMS_LOB.FILEGETNAME:



Ainda é possível utilizar a função DBMS_LOB.FILEEXISTS para descobrir quais arquivos foram deletados pelo sistema operacional mas ainda estão referenciados no banco da dados.

Conclusão
O texto original em inglês foi escrito pelo desenvolvedor Harry Fuecks e está disponível no site da Oracle.
No link há outros artigos sobre integração PHP e Oracle.

11 fevereiro 2009

Chad Keiffer: Aumentar a velocidade de desenvolvimento PHP com uma IDE, Templates e Snippets

Quando Chad Kieffer não está ocupado trabalhando em interfaces e administrando bancos de dados, ele está dando conselhos no seu blog 2 tablespoons.

Chad acredita que utilizando uma IDE como Eclipse PDT(Pacote de desenvolvimento PHP para o Eclipse), combinando com templates e snippets, a velocidade de desenvolvimento pode ser aumentada.

"Longas listas de tarefas e prazos curtos fazem com que os desenvolvedores não se familiarizem com funcionalidades avançadas que suas ferramentas proporcionam. Isso é uma vergonha pois algumas funcionalidades como Templates podem realmente reduzir o tempo de codificação e os erros."

Obs.: Este post é o quinto de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

07 fevereiro 2009

Ben Balbo: Invista em cache de informações

Ben Balbo está escrevendo para o Site Point, um site de tutoriais pare desenvolvedores e designers. Ele faz parte do comitê do Grupo de Usuários de PHP de Melbourne e do Clube de Desenvolvedores de Software Livre. Não é surpresa que ele recomende que um maior tempo seja gasto com cache no PHP.

"Se você tem um site que é predominantemente estático, como um blog, que é administrado por um sistema gerenciador de conteúdo, este terá pequenas alterações apenas, e com um pequeno tempo adicional gasto, é possível ter grandes benefícios de aumento de performance. Utilizar cache para sites mais complexos que geram conteúdo baseado no usuário, como um portal ou um comércio virtual, será um pouco mais complicado, porém os benefícios ainda serão claros"


Há várias técnicas de cache no PHP.
- Chamadas de funções com cache
- Setar cabeçalhos com data de expiração
- Utilizar cache em downloads no Internet Explorer
- Cache através de sistemas de template
- Cache_Lite
e muitos outros. Por causa da natureza dinâmica de linguagens como o PHP, cache é um ponto crítico para guardar aquelas partes da página que são acessadas frequentemente porém não são atualizadas sempre.

Obs.: Este post é o quarto de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

04 fevereiro 2009

Dave Child: Nunca, jamais acredite nos usuários

Dave Child é a mente por trás do site recentemente renomeado Added Bytes(Anteriormente ilovejackdaniels.com), que exibiu as excelentes Planilhas de Dicas para várias linguagens de programação feitas por Dave.
Dave trabalhou em várias empresas de desenvolvimento no Reino Unido e se estabeleceu como uma autoridade no mundo da programação.

Ele oferece alguns sábios conselhos sobre escrita de código seguro em PHP: Não acredite em seus usuários. Eles podem te machucar!

"A regra principal para desenvolvimento web é: Nunca, jamais, acredite nos seus usuários.
Assuma que todo pequeno pedaço de informação que seu site coleta de um usuário contém código malicioso. SEMPRE!
Isso inclui informação que você acha que checou com validações no cliente, por exemplo utilizando JavaScript.
Se você consegue controlar isso, será um bom começo. Se a segurança no PHP é importante para você, esse é o ponto principal a aprender.
Seja paranóico! Se você assume que seu site nunca será atacado, ou jamais enfrentará problemas, então algo está errado e você pode ter sérios problemas.
Porém se você acredita que cada visitante do seu site está pronto para atacar e que você está sempre em guerra, isso irá te ajudar a manter seu site seguro e preparado caso algo dê errado."


Obs.: Este post é o terceiro de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

Base de dados de CEPs disponível de graça!

Acho que todo mundo já passou por uma situação na qual há necessidade de preencher um endereço baseado em um CEP.
Infelizmente os Correios não proporcionam uma busca fácil em sua base para essa finalidade. Muito menos disponibilizam essa base de CEPs gratuitamente.
Portanto a solução mais utilizada é procurar na internet uma base de dados roubada adquirida de terceiros, ou então contratar o serviço de alguma empresa.

Para resolver, ou pelomenos amenizar essa situação, uma empresa de consultoria em software livre chamada (PC)² desenvolveu uma solução para acesso a essas informações.

Chamada de CEP Livre, essa solução é bastante simples de se utilizar. Basta fazer uma requisição HTTP a um endereço e receber, em formato XML ou CSV, as informações de um CEP.

O mais interessante dessa solução é que ela é colaborativa, ou seja, qualquer usuário pode adicionar um novo CEP no sistema, aumentando a base de dados e, além disso é gratuita, sem a necessidade de cadastro.
Por enquanto as informações somente podem ser acessadas online, mas a empresa promete lançar uma solução offline.

O CEP Livre pode ser utilizado gratuitamente em sistemas pessoais ou comerciais.

Para visualizar as informações de um CEP devem ser utilizadas as URLs abaixo:

1 - Resposta em XML - http://ceplivre.pc2consultoria.com/index.php?module=cep&cep=01311-000&formato=xml
2 - Resposta em CSV - http://ceplivre.pc2consultoria.com/index.php?module=cep&cep=01311-000&formato=csv

Para adicionar um CEP à base de dados do CEP Livre, acesse a URL abaixo:
http://ceplivre.pc2consultoria.com/index.php?module=cep&event=formeditacep

Obs.: As informações cadastradas são validadas pela empresa antes de serem adicionadas à base.

Para mais informações clique aqui

31 janeiro 2009

Matt Mullenweg: Utilize muitas tabelas com PHP e MySQL para escalabilidade

Ninguém precisa questionar a autoridade de Matt Mullenweg com PHP. Ele simplesmente desenvolveu o sistema de blogs mais popular do mundo: Wordpress.

Depois de criar o Wordpress, Matt e companhia lançaram o Wordpress.com, um site gratuito de blogs baseado no Wordpress MU. Atualmente o Wordpress.com hospeda mais de 4 milhões de blogs.
Se alguem sabe criar como criar um site com boa escalabilidade, é o Matt. Em 2006 ele explicou porquê o Wordpress utiliza uma tabela do MySQL separada para cada blog, ao contrário de usar uma tabela gigante para todos os blogs.

"Nós testamos essa técnica para o MU, mas descobrimos que é muito 'caro' escalar após um determinado ponto. Com estruturas monolíticas, você esbarra em uma parede baseada no seu hardware. No MU, os usuários são divididos e é possível particionar facilmente, por exemplo no WordPress.com nós temos usuários particionados entre 4096 bases de dados, o que te permite escalar eficientemente para centenas de milhares e até milhões de usuários com tráfego extremamente alto."


Poder migrar essas tabelas permite que o código e os blogs sejam executados mais rapidamente. Paralelamente, a utilização de cache e o uso inteligente de banco de dados, Matt mostrou que sites extremamente populares como Facebook e Wordpress.com podem administrar incríveis quantidades de informações

Obs.: Este post é o segundo de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui

29 janeiro 2009

Rasmus Lerdorf: Somente utilize PHP quando for realmente necessário

Não há pessoa que saiba melhor a capacidade do PHP do que seu criado. Rasmus Lerdorf criou o PHP em 1995, e desde então a linguagem se espalhou na comunidade de desenvolvimento de software, mudando a cara da Internet.
No entanto, Rasmus não criou o PHP com essa intenção. O PHP foi criado com o objetivo de solucionar problemas de desenvolvimento web.

"A motivação nunca foi filosófica ou narcisística. Foi puramente um caso de necessidade de uma ferramenta para solucionar problemas reais relacionados a Web. Em 1994 as opções eram muito limitadas em questão de ferramentas para desenvolvimento Web."

No entanto, você não pode utilizar PHP para tudo. Lerdorf é o primeiro a admitir que o PHP é somente uma ferramenta e tem suas limitações.

"Utilize a ferramenta correta para o trabalho. Já estive em empresas que utilizam o PHP em todas as ocasiões, porém o PHP não foi feito para ser uma linguagem de propósito geral, apropriada para todos os problemas."

Tentar utilizar o PHP para tudo não é eficiente, e certamente não é a melhor utilização do seu tempo como desenvolvedor web. Não tenha medo de utilizar outras linguagens se o PHP não estiver funcionando para seus projetos.

Obs.: Este post é o primeiro de uma série que mostra dicas de desenvolvimento pelos mestres do PHP. O post original em inglês foi feito pelo Glen Stansberry e pode ser visto clicando aqui