Posts Marcados php

Lá e de volta outra vez – Uma impressão sobre linguagens de programação que concorrem com o Java

php elephpant

Depois de muito tempo voltei a programar na linguagem PHP num novo projeto, fazem quase três meses e tenho tido boas impressões sobre esta linguagem, tenho ficado demasiado surpreso com a agilidade no desenvolvimento e com as melhorias que o grupo de desenvolvedores (The PHP Group) fizeram nesta nova versão, eu digo isso e rio de mim mesmo, pois, é realmente engraçado ver um Jedi falar de PHP e imagino que isso deve ser mais engraçado para os Jedi’s radicais ou mais modernos, por sorte e principalmente demasiado aprendizado não só das linguagens que concorrem, mas, também das culturas que as rodeiam, não é meu caso e por este exato motivo me sinto bastante acomodado programando nesta linguagem.

Leia o resto deste post »

Anúncios

, ,

Deixe um comentário

Sobrescrever o método open da classe window

Imagine a seguinte situação: Você entra numa empresa e o sistema que você vai manter usa aquelas janelas pop-ups do javascript, não estou falando do alert() me refiro aquelas da classe window, uma tristeza, inda mais se estivermos pensando em usabilidade e desempenho, eu digo isso, pois, é comum do usuário abrir inúmeros pop-ups destes e deixar em segundo plano ou minimizado, levando em conta maus hábitos de programação conhecido de alguns programadores em PHP, considere então conexões com o banco de dados não finalizadas até o término do script PHP, a solução é fazer com que o usuário abra estes pop-ups na mesma janela, substituindo o conteúdo de uma TAG DIV ou o atributo SRC de um IFRAME, mas, imagine também dez centenas de formulários abertos com window.open(), ficaria difícil ir a cada um e substituir né? Pois, para solucionar isso, nós podemos sobrescrever o método open() da classe window do javascript facilmente, veja abaixo um exemplo:

<script type="text/javascript">
window.open = function (open) {
    return function (url, name, features) { 
        return alert(url);
    };
}(window.open);


</script>

este código acima substitui a funcionalidade do método open() abrindo um alert() com a URL passada como parâmetro (return alert(url);), você poderia por ali qualquer coisa, por exemplo, escrever a URL com document.write().

Ao chamar o método ele mostrará uma caixa de texto com a URL passada por parâmetro.

<input type="button" value="clique" 
    onclick="javascript:window.open('http://www.google.com');">

Caso queira substituir o conteuúdo de um IFRAME, você deveria somente substituir
return alert(url); por document.getElementById("id_do_iframe").src=url;

Uma boa ideia agora é implentar este código para abrir as janelas em um painel esmaecido com DIV flutuante na frente da página que o chamou, fica muito bom!

Escrito por Roberson Carlos robersonfox at gmail.com 27/09/13

Written with StackEdit.

, , ,

Deixe um comentário

Otimizando consultas em um banco de dados MSSQL SERVER 2008

Na era dos bancos de dados NoSQL me deparei aqui na empresa onde trabalho com um velho problema, a otimização de consultas em um banco de dados relacional, e para piorar meu caso, um MSSQL 2008. No MySQL eu sempre fiz paginação usando LIMIT, porém, até pouco tempo atrás eu desconhecia o equivalente para o MSSQL, foi apanhando muito que cheguei ao estado de hoje e neste artigo ensino para quem se interessar boas práticas para otimização de consultas.

Quando enfrentei o problema pela primeira vez logo tentei usar o comando LIMIT do MySQL, porém, o MSSQL reportou um erro, então o jeito era definir uma data para exibição dos registros, imagine a seguinte situação, uma tabela que é consultada por 200 usuários simultâneos, esta tabela tem quase um milhão de registros e o programador anterior não fez nenhuma otimização de consultas, toda vez que um único usuário faz uma requisição na página do sistema o banco de dados percorre todos os quase um milhão de registro e mostra num JQuery todos os dados de uma vez, paginando no lado do cliente, um SELECT * FROM TABELA; eleva quatro processadores Xeon a 30%, isso com um único usuário, imagine a situação que este servidor passa, imagine o sofrimento dele.

Pois então, este é o cenário da batalha. A minha segunda tentativa foi definir para toda pesquisa sem condição uma condição que para o meu caso é muito válida, esta tabela possui um campo data_cadastro e na maioria das vezes o usuário não precisa ver os dados informados além do ano atual, então uma condição between entre a data 01-01-<?= date('Y')?> (01-01-2013) e a data atual: <?= date('m-d-Y') ?>, isso ajudou bastante, pois, reduziu a paginação do JQuery para 50 páginas, mesmo assim isso não desafogou o servidor e seus quatro processadores, as consultas retornavam tantos registros que geravam um arquivo HTML com 9.5MB de peso, até a rede sofria, o gasto médio de memória era de 6GB só para o MSSQL.

Uma nova intervenção foi necessária, o servidor estava negando serviço em muitos casos, então resolvi apelar para o LIMIT, pesquisei na web em busca de um equivalente para o MSSQL e descobri o TOP, analisei por um tempo o tanto de registro que os usuários exigiam e defini um limite 300, ainda assim seis telas na paginação do JQuery, adotei o critério de implementar a instrução TOP somente nas telas onde se faziam muito uso dos dados e ainda mais utilizadas pelos usuários, desta forma consegui desafogar o MSSQL.

O uso conjuto da instrução BETWEEN e da instrução TOP foi suficiente para assegurar um bom desempenho do servidor, mas, ainda assim não foi suficiente, um código mal escrito pode derrubar facilmente um servidor HP dedicado com ISS, PHP 5 e MSSQL 2008, não acreditava nisso até ver acontecer aqui, todas as medidas a nivel de codigo foram tomadas, o melhor a se fazer seria instalar um APACHE e a ultima versão do PHP, pois, esta já suporta as bibliotecas de Garbage Collector, coisa tão necessária e que esperou quase seis versões do PHP para ser implementado (disponível a partir da versão 5.3 do PHP).

A sintaxe para o uso do TOP é a seguinte: select TOP 300 * from tabela;.

Por fim, ainda com as instruções acima, algumas páginas geravam arquivos HTML enormes e que demoravam bastante para serem exibidos para o usuário final, então apliquei a função do artigo anterior e reduzi o tráfego da rede pela metade.
Estas otimizações não levaram nem uma semana para serem implementadas.

Escrito por Roberson Carlos robersonfox at gmail.com 23/09/13

Written with StackEdit.

, , , , ,

Deixe um comentário

Compactando uma página HTML antes de mostrá-la ao usuário

Compactando uma página HTML antes de mostrá-la ao usuário

Eu sempre quiz enviar a página final para o usuário compactada, quis isto para, economizar banda e reduzir tráfego, imagine a situação de uma página ter 512kb acessada por 100 usuários suponhamos a cada 10 minutos isto daria um tráfego enorme para um servidor simples

((512kb/1024)MB*100) a cada 10min

por hora algo em torno de 300MB. Uma forma de fazer isso seria compactar todo o código no servidor nas requisições do usuário, porém, isto gera alguns erros com alguns javascripts, teriamos que ter um código que faça uma compactação seletiva, por exemplo, algum algorítimo que compactasse somente os dados abaixo da tag de fechamento do cabeçalho ou início do corpo da página, mexendo no php.net compreendi como o PHP monta o HTML para o usuário e como ele manuseia o buffer, sendo assim, fácil implementar um compactador usando a função preg_replace, foi o que fiz, veja o resultado abaixo:

ob_start("compactar");
function compactar($b) { 
		$b = preg_replace('!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $b); 
		$b = str_replace(array("\r\n", "\r", "\n", "\t", '  ', '    ', '    '), '', $b);
		return $b;
}

ao final da página deve ser colocada a função ob_end_flush();.

Eu tenho usado esta função em alguns casos no início das páginas PHP e em outros casos acima do <body> , notei que alguns javascripts não gostam de serem desidentados. Tem funcionado perfeitamente e reduzido o volume de tráfego no servidor, o que devo fazer agora é remover todo o código javascript que está no index e colocá-lo separado. Quanto ao CSS, este não mostrou problemas algum.

Escrito por Roberson Carlos robersonfox at gmail.com 17/09/13

Written with StackEdit.

Deixe um comentário

Corrigir erro: DBLua error: Got error 28 from storage engine

Caso você tenha enfrentado problemas em sua base de dados e ela tem mostrado o erro “Got error 28 from storage engine“, faça os procedimentos abaixo para solucionar:

Em seu painel de administração (cpanel), abra o o Mysql Databases, pode ser o PHP My Admin ou equivalente,

nele marque todas suas tabelas e escolha reparar, desta forma o erro será corrigido.

Você pode também usar o comando REPAIR TABLE <tabela>, isto, caso você tenha acesso ao terminal Mysql.

, , , , , , ,

Deixe um comentário

O que é o ATOM

Atom é o nome dado a um estilo baseado em conteúdo XML e meta data, ou seja, é um protocolo em nível de aplicação para publicar e editar fontes web que são periodicamente atualizados, um exemplo para isto são os blogs.

Os feeds devem ser formados em formato XML e são identificados como application/atom+xml media type.

O funcionamento dele não difere das Markup Languages tradicionais, com cabeçalhos, títulos e corpo, como no HTML 4.0.

Elementos do Feed (Cabeçalho)

Um feed consiste de alguns Metadata seguidos por alguns números de entrada. Todo feed deve conter um cabeçalho.

<?xml version=”1.0″ encoding=”utf-8″?>
<feed xmlns=”http://www.w3.org/2005/Atom”&gt;

<title>Genova Home Page – News Feed</title>
<link href=http://www.genova.einet.com.br/>
<updated>2006-01-05 3:05:47</updated>

<author>
<name>Roberson Carlos Fox</name>
<email>robersonfox@genovaengine.com</email>
<uri>http://www.genova.einet.com.br/about-me</uri&gt;
</author>

<id>http://www.genova.einet.com.br</id&gt;
<icon>http://www.genova.einet.com.br/img/genova.ico</icon&gt;
<logo>http://www.genova.einet.com.br/img/G3.jpg</logo&gt;
<rights> © 2002-2006 Roberson Carlos Fox </rights>
<subtitle>Esteja atualizado com o que há de melhor na web</subtitle>
<category term=Informática/>
</feed>

Elementos requeridos do cabeçalho:

Abaixo se segue uma lista com os principais elementos requeridos em um feed e um exemplo.

  • ID, Identifica o Feed usando um universal e permanente URL, você pode colocar seu Nome de Domínio nesta parte. Ex.:
    <id>http://www.genova.einet.com.br</id&gt;
  • Title, contem o título do Feed, este valor não pode ser deixado em branco de maneira alguma. Ex.:
    <title>Genova Home Page – News Feed</title>

Elementos recomendados:

  • Author, nome do autor do Feed, um feed pode ter inúmeros autores e um feed precisa ter ao menos um autor. Ex.:
    <author>
    <name>Roberson Carlos Fox</name>
    <email>robersonfox@genovaengine.com</email>
    <uri>http://www.genova.einet.com.br/about-me</uri&gt;
    </author>
  • Link, identifica uma HP relacionada, o tipo de relação é atribuído pode atributo rel. Ex.:
    <link rel=”self” href=” http://www.genova.einet.com.br/&#8221; />
Elementos (Entradas) do Corpo (ENTRY)

Um exemplo de uma entrada seria um único post em um site.
<entry>
<title>Título do artigo</title>
<link href=http://www.genova.einet.com.br/artigos.php?id=46/>
<id>http://www.genova.einet.com.br/artigos.php?id=46/</id&gt;
<updated>05-01-2006 02:56:00</updated>
<summary>Descrição do artigo</summary>
<author>
<name>Roberson Carlos Fox</name>
</author>
</entry>
Elementos requeridos do corpo:

Aqui esta uma lista de elementos requeridos para o Feed, cada um tem uma breve descrição e é seguido de um exemplo, como no tópico acima.

  • ID, Title, tem o mesmo significado que o do cabeçalho, salvo que eles se referem ao artigo e não ao Feed. Ex.:
    <id>http://www.genova.einet.com.br/artigos.php?id=46</id&gt;
  • Updated, Indica quando foi a ultima vez que a entrada foi modificada. Ex.:
    <updated>05-01-2006 02:56:00</updated>

    Neste parte ainda cabem os elementos link e author que funcionam da mesma forma que no cabeçalho e como já foi dito, salvo que eles fazem referencia ao artigo e não ao Feed.

Uma entrada interessante é a:

  • Source, ela, a entrada, é usada para se referir a documentos copiados de outros Sites, assim seria como se falássemos que a fonte foi de outro local. Ex.:<source>
    <id>http://example.org/</id&gt;
    <title>Fourty-Two</title>
    <updated>2003-12-13T18:30:02Z</updated>
    <rights>© 2005 Example, Inc.</rights>
    </source>
Exemplo de feed

<?xml version=”1.0″ encoding=”utf-8″?>

<feed xmlns=”http://www.w3.org/2005/Atom”&gt;

<title>Genova Home Page – News Feed</title>
<link href=http://www.genova.einet.com.br/>
<updated>2006-01-05 3:05:47</updated>

<author>
<name>Roberson Carlos Fox</name>
<email>robersonfox@genovaengine.com</email>
<uri>http://www.genova.einet.com.br/about-me</uri&gt;
</author>

<id>http://www.genova.einet.com.br</id&gt;
<icon>http://www.genova.einet.com.br/img/genova.ico</icon&gt;
<logo>http://www.genova.einet.com.br/img/G3.jpg</logo&gt;
<rights> © 2002-2006 Roberson Carlos Fox </rights>
<subtitle>Esteja atualizado com o que há de melhor na web</subtitle>
<category term=Informática/>

<entry>
<title>Título do artigo1</title>
<link href=http://www.genova.einet.com.br/artigos.php?id=46/>
<id>http://www.genova.einet.com.br/artigos.php?id=46/</id&gt;
<updated>05-01-2006 02:56:00</updated>
<summary>Descrição do artigo1</summary>
<author>
<name>Roberson Carlos Fox</name>
</author>
</entry>

<entry>
<title>Título do artigo2</title>
<link href=http://www.genova.einet.com.br/artigos.php?id=47/>
<id>http://www.genova.einet.com.br/artigos.php?id=47/</id&gt;
<updated>06-01-2006 01:36:00</updated>
<summary>Descrição do artigo2</summary>
<author>
<name>Roberson Carlos Fox</name>
</author>
</entry>

</feed>

Colocando as coisas para funcionar com PHP

Como você pode notar, as entradas em um Feed podem vir de um banco de dados e ocupar muito espaço no feed, o bom seria pegar os últimos 15 posts do site em questão e enviá-los para uma variável fazendo uso de um loop como no exemplo:
<?php
$tabela := “artigos”;
$data=date(“Y-d-m G:i:s”);

// Conecta ao banco de dados MySQL
$db=mysql_connect($host, $sql_login ,$sql_passwd);
mysql_select_db ($nome_bd);

//estou assumindo que a tabela
//chame-se artigos na variável $tabela
$sql=”SELECT * FROM $tabela ORDER by ID desc”;

$resultado = mysql_query($sql,$db);

if (mysql_numrows($resultado)){
$a1=0;
while (($linha = mysql_fetch_row($resultado)) and ($a1!=15)) {
$a1=$a1+1;
$conteudo.=”
<entry>
<title>$linha[4]</title>
<link href=http://www.genova.einet.com.br/artigos.php?id=$linha[0]/>
<id>http://www.genova.einet.com.br/artigos.php?id=$linha%5B0%5D/</id&gt;
<updated>$linha[3]</updated>
<summary>$linha[5]</summary>
<author>
<name>$linha[1]</name>
</author>
</entry> “;
}
}

mysql_free_result($resultado);
if ($db){
mysql_close($db);
}
?>
//Estou assumindo que a
//Linha 4 = Título
//Linha 0 = ID do artigo
//Linha 3 = Data
//Linha 5 = Descrição
//Linha 1 = Autor
//Faça as alterações de forma que seu script funcione. ?>

Este simples script irá pegar os dados do banco de dados e criar as entradas, uma por uma, até um total de 15 entradas de acordo com a variável $a1. Em seguida você deverá adicionar o cabeçalho do Feed:
<?php
echo” <?xml version=”1.0″ encoding=”utf-8″?>
<feed xmlns=”http://www.w3.org/2005/Atom”&gt;
<title>Genova Home Page – News Feed</title>
<link href=http://www.genova.einet.com.br/>
<updated>$data</updated>

<author>
<name>Roberson Carlos Fox</name>
<email>robersonfox@genovaengine.com</email>
<uri>http://www.genova.einet.com.br/about-me</uri&gt;
</author>

<id>http://www.genova.einet.com.br</id&gt;
<rights> © 2002-2006 Roberson Carlos Fox </rights>
<subtitle>Esteja atualizado com o que há de melhor na web</subtitle>
<category term=Informática/>

$conteudo;

</feed>”
?>

Por fim, uma atenção especial para a variável “conteudo”, ela é gerada no primeiro script e armazena as entradas do Feed.

Com estas poucas informações você com certeza será capaz de criar um RSS em seu site.

, , ,

Deixe um comentário

  • Follow Carl Roberson's on WordPress.com
  • Fallow me
  • Linux 20 Anos
  • Ubuntu LTS Trusty Tahr

    Lançamento da versão LTS do Ubuntu20 de abril de 2014
    Ubuntu LTS Trusty Tahr Chegou!!! http://www.ubuntu.com/download/desktop
  • Grafica Livre

  • O que estou lendo agora

  • Na minha estante me aguardando


    Literatura
  • Bookmark and Share