Archive for agosto, 2010

27 de agosto de 2010

Problema com session em frame / iframe no Internet Explorer

por adlerparnas

Fala pessoal!

Hoje estou aqui para mostrar uma solução para os problemas com sessões nos  frames/iframes no Internet Explorer versões 6, 7 e 8. Não sou muito adepto aos  elementos  frame e iframe, mas sei que muitas pessoas usam e que são uma ótimo recurso.

Desenvolvendo um projeto no meu trabalho, nossa página seria aberta em  um iframe na  aplicação do cliente. Eis que me aparece o problema, a sessão do usuário em nosso sistema  não era gravada.

Pesquisando pela WEB, descobri no site ASPBRASIL que o problema acontecia por causa de uma diretiva de segurança do Internet Explorer que restringe a gravação de cookies na máquina do usuário. Essa diretiva denominada P3P é descrita pelo W3C.

Seguindo as instruções do site ASPBRASIL, basta alterar a propriedade P3P no cabeçalho do HTTP para que a página consiga gravar os cookies na máquina do cliente. Aqui senha um exemplo em ASP e em PHP de como alterar essa diretiva no cabeçalho HTTP.

<%
Response.AddHeader("P3P", "CP=\"IDC DSP COR CURa ADM ADMa DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT PHY ONL COM STA\"");
%>
<?php
header('P3P: CP="IDC DSP COR CURa ADM ADMa DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT PHY ONL COM STA"');
?>

ATENÇÃO: a diretiva deve ser alterada na página que irá abrir dentro do frame.

Ainda não estudei todas essas diretivas, mais sei que vai funcionar! 😀

É isso ai pessoal! Espero que essa dica seja útil a todos vocês e caso tenha dito algo errado,  favor me corrijam!

Fontes:

Anúncios
24 de agosto de 2010

Criar daemons em PHP

por adlerparnas

Fala Pessoal!

Meu nome é Adler Parnas, depois de um tempo OFF, venho falar de como criar daemons utilizando PHP.

Todos nós, programadores PHP, sabemos que essa linguagem funciona muito bem rodando sobre um servidor WEB (Apache, IIS, etc..), mas quantas vezes precisamos rodar uma rotina de backup automática no servidor ou mesmo criar um daemon para monitorar uma fila? OK! Podemos criar scripts em SHELL, Phyton, PERL e etc…, mas eu domino PHP!

A execução de um script PHP pela linha de comandos é extremamente fácil! Basta que você chame o executável do PHP passando como parâmetro o nome do arquivo a ser executado.

#executando script pela linha de comandos (GNU/Linux)
$ php meu_script.php

Este tipo de recurso, nos permite por exemplo criar scripts que serão executados no CRON de um servidor, resolvendo por exemplo a necessidade de rotinas de backup.

Outra possibilidade é criar daemons( programas que rodam em background no servidor num loop infinito) para monitorar portas ou filas de requisições. Como um daemon é um loop infinito, nada melhor que um while para fazer com que sua rotina execute eternamente.

<?php
while(TRUE){

// Faça sua mágica aqui!!

}
?>

O grande pulo do gato, para que você não acabe com os recursos do seu servidor, você DEVE incluir a chamada da função sleep, para que seu servidor respire a cada iteração.

<?php
while(TRUE){

// Faça sua mágica aqui!!
sleep(10);  //sua rotina será executada a cada 10 segundos
}
?>

Como disse, este tipo de recurso é ótimo para monitoramento de portas ou filas (usei para isso :D). Então digamos que você compre um plano de hospedagem de site que lhe permita o acesso via SSH, assim você poderá executar seu daemon. O único problema é que quando você finalizar a sessão, todos os aplicativos executados por você também serão finalizados. Isso ocorre porque os aplicativos executados são filhos da sua sessão. Para resolver isso utilizei um script que executa meu daemon e finaliza, deixando o daemon “órfão”, deixando que eu finalize minha sessão SSH, sem que meu daemon pare de rodar.

Este é um exemplo de um daemon em PHP que a cada 10 segundos escreve num arquivo na pasta /tmp/ do meu servidor (GNU/Linux):


<?php
/**
* Programa daemon.php que escreve na diretório /tmp
*/

// guardando a hora de início da execução do daemon
$init = microtime(true);

//iniciando loop infinito
do{
 exec('echo "Estou rodando a '.(microtime(true) - $init).' segundos" >> /tmp/daemon.log');

 // adormecendo o daemon por 10 segundos
 sleep(10);
}while(TRUE);
?>

Para chamar meu daemon, sem que ele morra no final da sessão, escrevi uma script que utiliza a função proc_open para iniciar o processo:

<?php
/**
* Programa para executar o daemon
*/

//array de pipes, parâmetro obrigatório da função proc_open
$array_pipes = array();

//executando o daemon
proc_open("php daemon.php &", array(), $array_pipes);

exit;
?>

É isso ai pessoal! Espero que essa dica seja útil a muitos de vocês como foi para meu projeto. Caso tenha dito algo errado, favor me corrijam! Postem suas dúvida e/ou comentários!

PS.: O Próximo artigo será como criar daemons no Code Igniter! 😀