Classe para Manipular Videos do Youtube via XML

Filed Under (Novas Tecnologias, PHP, Programação) by Alex P. Torres on 31-07-2010

Ola.
venho hoje disponibilizar uma forma de manipular videos do youtube, em seu site.
procurei na internet algo que  falasse sobre o assunto mais, é um assunto com poucas informações na internet.
foi simples achei um classe em PHP que trata va os videos do youtube, a classe foi feita por um brasileiro.
vamos ao que interessa.

Youtube.classe.php


<?
 class youtube
 {
 public $url;
 public $id;

 public function url2id()
 {
 $aux = explode("?",$this->url);
 $aux2 = explode("&",$aux[1]);
 foreach($aux2 as $campo => $valor)
 {
 $aux3 = explode("=",$valor);
 if($aux3[0] == 'v') $video = $aux3[1];
 }
 return $this->id = $video;
 }

 public function url2id_($url)
 {
 $aux = explode("?",$url);
 $aux2 = explode("&",$aux[1]);
 foreach($aux2 as $campo => $valor)
 {
 $aux3 = explode("=",$valor);
 if($aux3[0] == 'v') $video = $aux3[1];
 }
 return $this->id = $video;
 }

 public function thumb_url($tamanho=NULL)
 {
 $tamanho = $tamanho == "maior"?"hq":"";
 $this->url2id();
 return 'http://i1.ytimg.com/vi/'.$this->id.'/'.$tamanho.'default.jpg';
 }

 public function thumb($tamanho=NULL)
 {
 $tamanho = $tamanho == "maior"?"hq":"";
 $this->url2id();
 return '<img src="http://i1.ytimg.com/vi/'.$this->id.'/'.$tamanho.'default.jpg" border="0" >';
 }

 public function info()
 {
 $feedURL = 'http://gdata.youtube.com/feeds/base/videos?q='.$this->id.'&client=ytapi-youtube-search&v=2';
 $sxml = simplexml_load_file($feedURL);
 foreach ($sxml->entry as $entry)
 {
 $details = $entry->content;
 $info["titulo"] = $entry->title;
 }
 $details_notags = strip_tags($details);
 $texto = explode("From",$details_notags);
 $info["descricao"] = $texto[0];
 $aux = explode("Views:",$texto[1]);
 $aux2 = explode(" ",$aux[1]);
 $info["views"] = $aux2[0];

 $aux = explode("Time:",$texto[1]);
 $aux2 = explode("More",$aux[1]);
 $info["tempo"] = $aux2[0];

 $imgs = strip_tags($details,'<img>');
 $aux = explode("<img",$imgs);
 array_shift($aux);
 array_shift($aux);
 $aux2 = explode("gif\">",$aux[4]);
 array_pop($aux);
 $aux3 = $aux2[0].'gif">';
 $aux[] = $aux3;
 $imagens = '';
 foreach($aux as $campo => $valor)
 {
 $imagens .= '<img'.$valor;
 }
 $info["estrelas"] = $imagens;
 return $info;
 }

 public function busca($palavra)
 {
 $feedURL = 'http://gdata.youtube.com/feeds/base/videos?q='.$palavra.'&client=ytapi-youtube-search&v=2';
 $sxml = simplexml_load_file($feedURL);
 $i=0;
 foreach ($sxml->entry as $entry)
 {
 $details = $entry->content;
 $info[$i]["titulo"] = $entry->title;
 $aux = explode($info[$i]["titulo"],$details);
 $aux2 = explode("<a",$aux[0]);
 $aux3 = explode('href="',$aux2[1]);
 $aux4 = explode('&',$aux3[1]);
 $info[$i]["link"] = $aux4[0];
 $details_notags = strip_tags($details);
 $texto = explode("From",$details_notags);
 $info[$i]["descricao"] = $texto[0];
 $aux = explode("Views:",$texto[1]);
 $aux2 = explode(" ",$aux[1]);
 $info[$i]["views"] = $aux2[0];

 $aux = explode("Time:",$texto[1]);
 $aux2 = explode("More",$aux[1]);
 $info[$i]["tempo"] = $aux2[0];

 $imgs = strip_tags($details,'<img>');
 $aux = explode("<img",$imgs);
 array_shift($aux);
 array_shift($aux);
 $aux2 = explode("gif\">",$aux[4]);
 array_pop($aux);
 $aux3 = $aux2[0].'gif">';
 $aux[] = $aux3;
 $imagens = '';
 foreach($aux as $campo => $valor)
 {
 $imagens .= '<img'.$valor;
 }
 $info[$i]["estrelas"] = $imagens;
 $i++;
 }
 return $info;
 }

 public function player($width,$height)
 {
 $this->url2id();
 print '<object width="'.$width.'" height="'.$height.'"><param name="movie" value="http://www.youtube.com/v/'.$this->id.'&fs=1"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/'.$this->id.'&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="'.$width.'" height="'.$height.'"></embed></object>';
 }
 }
?>

Aqui vou disponibilizar os exemplos de como usar.

</pre>
$obj = new youtube;
 $obj->url = "http://www.youtube.com/watch?v=PzF98ur3kKU";
 $obj->player("480","385");/// Tamanho do video
 print '<br>';
 print $obj->url2id(); /// ID DO VIDEO
 print '<br>';
 print $obj->url2id_("http://www.youtube.com/watch?v=PzF98ur3kKU"); /// ID DE UM VIDEO
 print '<br>';
 print $obj->thumb_url("maior");/// MOSTRA ENDEREÇo da IMAGEM  MAIOR
 print '<br>';
 print $obj->thumb_url(); /// MOSTRA ENDEREÇo da IMAGEM  PEQUENA
 print '<br>';
 print $obj->thumb(); ///mostra IMagem PEQUENA
 print '<br>';
 print $obj->thumb("maior"); /// mostra iomagem MAIOR
 print '<br>';
 $info = $obj->info();
 print $info["titulo"]; /// mostra titulo
 print '<br>';
 print $info["descricao"]; /// mostra DESCRIÇÂO
 print '<br>';
 print $info["views"]; /// mostra VIEWS
 print '<br>';
 print $info["tempo"]; /// mostra TEMPO
 print '<br>';
 print $info["estrelas"]; /// mostra ESTRELAS
 print '<br>';

$arquivos = $obj->busca("Yupimix");

$listagem = array();

foreach($arquivos as $f) {
 if(strpos($f,'.')!==0) {
 array_push($listagem, $f);
 }
}
#Definimos quantos arquivos exibir por página
$paginas = array_chunk($listagem, 5);

$pagina = (int)$_GET["lista"];
$paginas[$pagina];

 //$busca = $obj->busca("Yupimix");

 //foreach (array_slice($consulta, 0, 10) as $key => $val) {
 foreach($paginas[$pagina] as $campo => $valor)
 {
 print 'Titulo:  '.$valor['titulo'].'<br>';
 print 'Link: '.$valor['link'].'<br>';
 print 'Descrição : '.$valor['descricao'].'<br>';
 print 'Views : '.$valor['views'].'<br>';
 print 'Tempo : '.$valor['tempo'].'<br>';
 print 'Estrelas : '.$valor['estrelas'].'<br>';

 $propriedade = new youtube;
 $propriedade->url = $valor['link'];
 print $propriedade->thumb().'<br>';

 print '--------------<br>';
 }

 #Montamos os links da paginação
for($i=1; $i< count($paginas)+1; $i++) {
 echo "[ <a href=\"?lista=$i\">$i</a> ] ";
}

neste codigo de exemplos eu implante uma paginação.
Se você quiser saber mais informações sobre a classe aqui esta o link

Guia prático de MySQLi no PHP

Filed Under (Internet, Novas Tecnologias, PHP, Programação) by Alex P. Torres on 26-06-2010

Hoje vou falar um pouquinho sobre o MySQLi que é uma extensão do PHP feita para aproveitar os recursos mais avançados do MySQL. O legal do MySQLi é que ele pode ser usado de forma orientada a objetos.

Atenção: As funções MySQLi funcionam apenas com PHP 5 (ou superior) e MySQL 4.1.3 (ou superior).

Não se esqueça de antes de testar esses scripts verificar se o MySQLi está habilitado no seu PHP dando uma olhada no phpinfo().

Veja um exemplo de scripts onde faremos todas as operações comuns do MySQL:

Veja o Tutorial aqui:

Corrector de texto PHP – com Textarea

Filed Under (PHP, Programação) by Alex P. Torres on 22-05-2010

Tagged Under : , , , , , , , , , , ,

PHPWebCorrector é uma correção do texto desenvolvido por ProgramacionWeb.net que funciona em qualquer servidor web que tenha PHP, sem a necessidade de instalar qualquer biblioteca executável ou externo.

Esta correcção é escrito em PHP puro e permite a correção de um texto de um arquivo de dados com todas as palavras certas, com um tempo realmente incrível. Você pode ver um exemplo de quão bem ele funciona e baixar o arquivo de correção, que inclui o dicionário de espanhol, portugues e outros idiomas como estes.

Español
Catalan
Inglés
Portugués

Configurando o Corretor.
Para usar a magia, provavelmente terá que incluir no seu arquivo phpwebcorrect.php página PHP, então você pode usar as seguintes funções:


include 'phpwebcorrect/phpwebcorrect.php';

phpwc_init();
phpwc_boton_corregir('text2');
phpwc_boton_idioma('text2');
phpwc_textarea(500,200,'text2','ejemplo');

Veja um exemplo On-line
http://www.programacionweb.net/descargas/corrector-texto-php/ejemplo/

Sisteminha simples de Enquete com PHP e MySql

Filed Under (PHP, Programação) by Alex P. Torres on 02-03-2010

Tagged Under : , , ,

Bom hoje vamos criar um sistema simples de enquete com PHP e m MySql
muito simples primeiramente vou mostrar o SQL  para colocar no Mysql


CREATE TABLE `enquete` (
 `ip` VARCHAR( 16 ) NOT NULL ,
 `votacao` INT( 1 ) NOT NULL ,
 UNIQUE (
 `ip`
 )
);

Se voce quiser que o usuario efetua varias votações você somente
tira

 UNIQUE (
 `ip`
 )
feito isto faremos o calculode  porcentagem.
$porcentaje = round($votos/$total*100,2); 

Otima Classe para integrar um template em seu sistema

Filed Under (PHP, Programação) by Alex P. Torres on 30-11-2009

Tagged Under : , , , , , , ,

Uma das coisas que as pessoas mais me perguntam sobre PHP, é sobre o uso de Templates. Ou porque leram em algum livro ou fórum, ou seja porque eu comentei em aula.

Através do uso de templates, deixamos toda a estrutura visual (HTML ou XML, CSS, etc) separado da lógica de programação (código PHP), o que melhora e muito tanto a construção quanto a manutenção de sistemas web.

Existem vários mecanismo de template para PHP, e há um bom tempo no mercado. Mas qual indicar? Sem dúvida alguma, o Smarty é hoje o mais completo deles. Porém, o mais complexo, e de curva mais demorada. Ele é praticamente uma linguagem a parte do PHP.

Com base nisso, eu resolvi colocar criar um tutorial baseado em um mecanismo de template muito mais simples. Ou seja: este não é um tutorial sobre o Smarty. É sobre Templates, mas baseado uma biblioteca que eu mesmo desenvolvi, e uso em meus projetos (mesmo nos maiores deles), na qual gastei bastante tempo desenvolvendo e melhorando, sempre com o foco principal na facilidade de uso.

Mas quase todos os conceitos vistos neste tutorial se aplicam a maioria das classes de Template existentes em PHP, portanto, se você entender as idéias explicadas aqui, poderá usar seu mecanismo de Templates favorito.

Para criar esta biblioteca (eu uso templates há muitos anos, quando só existia a PHPLib), eu estudei vários mecanismos de templates (PHPLib, Sigma, etc), portanto não estou “reinventando a roda”, apenas “me apoiei no ombro de gigantes” para criar algo muito mais fácil de usar, que atendesse minhas necessidades e da empresa que eu trabalhava na época. De fato, atualmente muita gente usa esta biblioteca.

Eu inclusive traduzi os comentários dos métodos/funções públicos para facilitar. Você verá que será preciso entender apenas duas idéias básicas: variáveis e blocos.

Então, vamos lá.

LINK: site do desenvolvedor

1º UruguaianaTech

Filed Under (Eventos, Linux, PHP, Programação, Sistema Operacional) by Alex P. Torres on 24-11-2009

Tagged Under : , , , , ,

logo_r2_c245545454566
Com a missão de educar para o trabalho em atividades do comércio de bens, serviços e turismo, o SENAC Uruguaiana promove nos dias 26, 27 e 28 de novembro o 1° UruguaianaTech, evento que visa difundir a utilização do Software Livre nos diversos setores de nossa comunidade.

Sempre conectado às inovações do mercado e atento às novas tendências em tecnologia, o núcleo de TI do Senac Uruguaiana, ministrará palestras sobre os temas: Linux, Servidores, Segurança, Desenvolvimento de Aplicações Web e Móvel.

Esta edição contará com a presença de profissionais de destaque no mercado da Tecnologia da Informação, com ampla experiência na utilização de Software Livre em ambientes corporativos, educacionais e domésticos.

O evento será realizado no auditório do Colégio Marista Sant’Ana. As inscrições podem ser realizadas através do site ou na unidade do Senac, mediante a colaboração com um alimento não-perecível. Aos interessados na emissão do certificado, o investimento será de R$10,00.

Vejam abaixo a programação do evento. Destaque para o 1º e 2º dia onde os editores deste blog, Thiago Finardi e Rodrigo Aramburu, ministrarão palestras no evento.
Vamos lá pessoal, participem e ajudem no crescimento da área de TI em nossa cidade.

http://www.uruguaianatech.info

Resultados de busca do Google no seu site

Filed Under (PHP, Programação) by Alex P. Torres on 23-11-2009

Tagged Under : , , , , , , , , , , ,

Aprenda usar a API do Google para fazer buscas atraves de seu site.
esta classe foi desenvolvida por Thiago Belem

Eu somente utilizei e gostei como funciona muito bom..


<?php

/**
 * API de busca do Google
 *
 * @author   Thiago Belem (<a href="mailto:contato@thiagobelem.net">contato@thiagobelem.net</a>)
 * @link   <a href="http://thiagobelem.net/blog/">http://thiagobelem.net/blog/</a>
 * @version   1.1
 */
class googleSearchAPI {
 protected $url = 'http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=large&start=%s&q=%s';
 var $resultado, $pagina, $keywords;

 function __construct() {
  if (!function_exists('curl_init')) {
   trigger_error('A biblioteca cURL não está instalada!');
   return false;
  }
  if (!function_exists('json_decode')) {
   trigger_error('A biblioteca para manipulação de JSON não está instalada!');
   return false;
  }
 }

 /**
  * Pega o resultado HTTP de uma URL
  */
 protected function httpRequest($url) {
  $cURL = curl_init($url);
  curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($cURL, CURLOPT_FOLLOWLOCATION, true);
  $resultado = curl_exec($cURL);
  $resposta = curl_getinfo($cURL, CURLINFO_HTTP_CODE);
  curl_close($cURL);
  return $resultado;
 }

 /**
  * Executa a busca
  */
 function busca($keywords = null, $pagina = 1, $site = null) {
  $keywords = (is_null($keywords)) ? $this->keywords : $keywords;
  $start = (is_null($pagina)) ? 0 : (($pagina - 1) * 8);

  $bkeywords = (!is_null($site)) ? ($keywords . ' site:' . $site) : $keywords;

  $url = sprintf($this->url, (int)$start, urlencode($bkeywords));
  $resultado = $this->httpRequest($url);
  if (!$resultado) {
   trigger_error('Não foi possível acessar a URL de busca:<br />' . $url);
   return false;
  }
  $resultado = json_decode($resultado, true);

  $this->resultado = $resultado['responseData'];
  $this->keywords = $keywords;
  $this->pagina = $pagina;
 }

 /**
  * Pega os resultados encontrados
  */
 function resultadoSites() {
  return $this->resultado['results'];
 }

 /**
  * Pega o total de sites encontrados
  */
 function resultadoTotal() {
  return $this->resultado['cursor']['estimatedResultCount'];
 }
}

?>

Exemplo de Uso nesta pagina você modifica a seu gosto.


<?php

$keywords = 'Thiago Belem';
$pagina = (isset($_GET['p'])) ? (int)$_GET['p'] : 1;

$gs = new googleSearchAPI();
//$gs->busca($keywords, $pagina); // Busca normal
$gs->busca($keywords, $pagina, 'thiagobelem.net'); // Busca em um site específico

$total = $gs->resultadoTotal();

echo "Total estimado de resultados: " . $total;
echo "<br />";
echo "<h2>Pagina: " . $gs->pagina . "</h2>";

foreach ($gs->resultadoSites() as $item) {
 echo "<h3>" . $item['title'] . "</h3>";
 echo "<p>" . $item['content'] . "</p>";
 echo '<a href="' . $item['unescapedUrl'] . '">' . $item['visibleUrl'] . "</a>";
}

echo "<hr />";

// Paginadores:

if (($pagina - 5) > 1) echo '...&nbsp;';

for ($n = 1; $n <= ceil($total / 8); $n++) {
 if (($n < ($pagina - 5)) OR ($n > ($pagina + 5))) continue;
 echo '<a href="?q='.$keywords.'&p='.$n.'">'.$n.'</a>&nbsp;';
}

if (($pagina + 5) < $total) echo '...';

?>

Infelizmente essa API de busca do Google só retorna 8 resultados por vez (uma limitação do Google mesmo)… mas você tem acesso a todas as páginas que precisar.. É só mudar o valor da variável $pagina (do exemplo).

Script Corretor de texto para seu site ou sistema

Filed Under (PHP, Programação) by Alex P. Torres on 18-11-2009

Tagged Under : , , , , , , , , , ,

PHPWebCorrector é um corretor  de texto desenvolvido por ProgramacionWeb.net que trabalha em qualquer servidor web que tenha php sem necessidade de instalar nenhum biblioteca.

Disponivel em Ingles, Catalan, e Portugues da Portugal

para mais informação acesse aqui:

http://www.programacionweb.net/descargas/corrector-texto-php/descargar/

Solução para calculo de frete para desenvolvedores

Filed Under (E-commerce, PHP, Programação) by Alex P. Torres on 18-11-2009

Tagged Under : , , , , , , , , , ,

Ola hoje vou falar um pouco sobre e-commerce   mais especificamente sobre o calculo de frete gratuito para suas lojas desenvolvidas.
seguramente muitos de vocês tem problemas com o webservice de calculo de frete dos correios, por que muitas e muitas veces ele fica fora do ar.

para não acontecer mais isso existe o calculo de frete do Pagseguro.
na qual existe uma classe para isso que utiliza a biblioteca cUrl.
Download da classe

para implantar é simples siga o script a seguir:


<?php
// Use require_once para que o arquivo nunca seja chamado duas vezes
require_once('frete.php');

// Instancie o Objeto gerador de frete
$frete = new PgsFrete;

// Faça seu cálculo passando:

// CepOrigem
// Peso (em quilos)
// Valor
// CepDestino

$valorFrete = $frete->gerar('00000-000', '4', '7,80', '01000-000');
?>

vai mostra esta array:

array (
    'Sedex' => '33,60',
    'PAC' => '17,40',
)

para mostrar o valor:

echo  $valorFrete[Sedex].<br>;
echo  $valorFrete[PAC];

Gerador de miniaturas que gravam em seu servidor ( Thumbnails )

Filed Under (PHP, Programação) by Alex P. Torres on 17-11-2009

Tagged Under : , , , , , , , , , , ,

icone_jpeg

gerador de miniaturas no codigo esta o autor e on tutorial bem simples.


<?php

/***
script que gera efetua download de imagens e gera miniaturas

Se miniatura nao existir, gera a miniatura
Apos ou se a miniatura ja existir, redireciona o usuario para a imagem em cache

autor: Roberto Berto darkelder@php.net
licença: GPL v2

Caracteristicas:
- gera miniaturas JPG ja do width e height desejado
- usa cache: o algoritmo de redimensionamento - que e' pesado - e' utilizado
apenas uma vez para cada imagem, sendo o resultado salvo em uma pasta

Exemplo:
- sua imagem em tamanho grande esta em http://www.seusite.com.br/fotos/foto_joao.jpg
o tamanho da mesma e' 640x480 pixels
- voce utiliza o seguinte codigo hoje:
<img src="/fotos/foto_joao.jpg" width="80" height="60" >

- agora utilize apenas da seguinte forma:
<img src="/miniatura.php?foto=/fotos/foto_joao.jpg&width=80" width="80" height="60" >

onde:
foto= url da foto
width= tamanho em pixels da largura a ser gerada
height= tamanho em pixels da altura a ser gerada

Configuracao:
1) altere a constante de PASTA e URL da PASTA abaixo para a pasta onde as miniaturas serao salvas

2) voce deve criar a pasta da constante pelo seu FTP sem nenhum arquivo dentro

3) pergunte ao seu provedor se a pasta tem permissao para gravar arquivos, dependendo da configuracao
do provedor e' necessario adicionar essa permissao na pasta. Geralmente isso pode ser feito por voce
mesmo no gerenciador de arquivos do seu painel de controle ou pelo seu programa de FTP com o chmod 0777
Na TeHospedo (http://tehospedo.com.br/), que e' o provedor onde trabalho, esse procedimento nao e' necessario nem no Windows
nem no Linux

**/

// essa variavel e' o seu dominio
define("URL_SITE", 'http://seusite.com.br'); # ----> nao ponha / no final

/******* configuracao para linux **********/
// em linux na TeHospedo apenas altere meuUserdeFTP:
define("PASTA_CACHE", '/home/meuuserdeFTP/public_html/miniaturas/');

/******* configuracao para windows ********/
// em windows na TeHospedo descomente a linha abaixo e mude apenas o meuDominio.com.br:
// mesmo em windows, nao use \ para separar diretorios, use / que e' mais facil
// se descomentar a linha abaixo comente o define anterior
//
// define("PASTA_CACHE", 'd:/domains/meuDominio.com.br/wwwroot/miniaturas/');

/******* configuracao tanto para windows quanto para linux ******/
// a URL abaixo deve corresponder ao endereco web da PASTA_CACHE
define('URL_CACHE', 'http://seusite.com.br/miniaturas'); # ---> nao ponha / no final

// se for uma grande quantidade de arquivos, e' interessante deixar true
// assim, ira separar as miniaturas em subpastas
define('USAR_MULTI_DIRETORIOS', true);

////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////

/******** tratamento de variaveis *********/
$url = URL_SITE . '/' . $_REQUEST['foto'];

$width = (int)$_REQUEST['width'];

$width = 143;

// nome dos arquivos que sera usado dentro da pasta de cache
$arquivo = sprintf("%s-%d.jpg",
  md5($url),
  $width
);

if (USAR_MULTI_DIRETORIOS == true) {
	// nome do arquivo com multiplos diretorios
	$arquivo_full = sprintf("%s/%s/%s",
	   substr($arquivo, 0, 2),
	   substr($arquivo, 2, 2),
	   $arquivo
	);
} else {
 	// nome do arquivo sem multiplos diretorios
	$arquivo_full = $arquivo;
}

// path e url do arquivo completa
$arquivo_path = sprintf("%s/%s", PASTA_CACHE, $arquivo_full);
$arquivo_path = str_replace("//", "/", $arquivo_path); // substitui // por /
$arquivo_url  = sprintf("%s/%s", URL_CACHE, $arquivo_full);
$arquivo_path_tmp = $arquivo_path . '.tmp';

/*

printf("full: %s\n", $arquivo_full);
printf("path: %s\n", $arquivo_path);
printf("url: %s\n", $arquivo_url);
*/

if (file_exists($arquivo_path)) { // arquivo existe, vamos apenas redirecionar para ele
	header(sprintf("Location: %s", $arquivo_url));
	exit;
}

// miniatura nao existe, vamos gerar!

// gerar subdiretorio se for usado este metodo
if (USAR_MULTI_DIRETORIOS == true) {
	$dir_level_1 = sprintf("%s/%s",
		PASTA_CACHE,
	        substr($arquivo, 0, 2)
	);

	$dir_level_2 = sprintf("%s/%s/%s",
		PASTA_CACHE,
	        substr($arquivo, 0, 2),
		substr($arquivo, 2, 2)
	);

	// subdiretorio nao existe, cria
	if (!file_exists($dir_level_1)) {
		mkdir($dir_level_1);
	}

	if (!file_exists($dir_level_2)) {
		mkdir($dir_level_2);
	}
}

// efetuar download da miniatura num arquivo tmp
$fp = fopen($arquivo_path_tmp, 'w');

// abre o arquivo
$dados = file_get_contents($url);
if ($dados === false) {
	die("nao posso abrir o arquivo\n\n");
}

fwrite($fp, $dados);

// gerar o thumb

$i = new imagethumbnail();
$i->open($arquivo_path_tmp); // coloque aqui o nome do arquivo original
$i->setX($width);
$i->imagejpeg($arquivo_path, 70);

unlink($arquivo_path_tmp);

if (file_exists($arquivo_path)) { // arquivo existe, vamos apenas redirecionar para ele
	header(sprintf("Location: %s", $arquivo_url));
	exit;
}

die("Algum erro ocorreu");

    class imagethumbnail {

        var $filename;
        var $x;
        var $y;
        var $image;
        var $thumbnail;

        function open($filename) {

            $this->filename = $filename;
            $imageinfo = array();
            $imageinfo = getimagesize($this->filename,$imageinfo);

            $this->old_x = $imageinfo[0];
            $this->old_y = $imageinfo[1];

            switch ($imageinfo[2]) {
                case "1": $this->image = imagecreatefromgif($this->filename); break;
                case "2": $this->image = imagecreatefromjpeg($this->filename); break;
                case "3": $this->image = imagecreatefrompng($this->filename); break;
            }

        }

        function setX($x="") {
            if (isset($x)) { $this->x = $x; }
            return $this->x;
        }

        function setY($y="") {
            if (isset($y)) { $this->y = $y; }
            return $this->y;
        }

        function generate() {

            if ($this->x > 0 and $this->y > 0) {
                $new_x = $this->x;
                $new_y = $this->y;
            } elseif ($this->x > 0 and $this->x != "") {
                $new_x = $this->x;
                $new_y = ($this->x/$this->old_x)*$this->old_y;
            } else {
                $new_x = ($this->y/$this->old_y)*$this->old_x;
                $new_y = $this->y;
            }

            $this->thumbnail = imagecreatetruecolor($new_x,$new_y);
            $white = imagecolorallocate($this->thumbnail,255,255,255);
            imagefill($this->thumbnail,0,0,$white);

            imagecopyresampled ( $this->thumbnail, $this->image, 0, 0, 0, 0, $new_x, $new_y, $this->old_x, $this->old_y);

        }

        function imagejpeg($filename="",$quality=100) {
            if (!isset($this->thumbnail)) { $this->generate(); }
            imagejpeg($this->thumbnail,$filename,$quality);
        }

    }

?>

Duvidas comente

<?php

/***
script que gera efetua download de imagens e gera miniaturas

Se miniatura nao existir, gera a miniatura
Apos ou se a miniatura ja existir, redireciona o usuario para a imagem em cache

autor: Roberto Berto darkelder@php.net
licença: GPL v2

Caracteristicas:
- gera miniaturas JPG ja do width e height desejado
- usa cache: o algoritmo de redimensionamento - que e' pesado - e' utilizado
apenas uma vez para cada imagem, sendo o resultado salvo em uma pasta

Exemplo:
- sua imagem em tamanho grande esta em http://www.seusite.com.br/fotos/foto_joao.jpg
o tamanho da mesma e' 640x480 pixels
- voce utiliza o seguinte codigo hoje:
<img src="/fotos/foto_joao.jpg" width="80" height="60" >

- agora utilize apenas da seguinte forma:
<img src="/miniatura.php?foto=/fotos/foto_joao.jpg&width=80" width="80" height="60" >

onde:
foto= url da foto
width= tamanho em pixels da largura a ser gerada
height= tamanho em pixels da altura a ser gerada

Configuracao:
1) altere a constante de PASTA e URL da PASTA abaixo para a pasta onde as miniaturas serao salvas

2) voce deve criar a pasta da constante pelo seu FTP sem nenhum arquivo dentro

3) pergunte ao seu provedor se a pasta tem permissao para gravar arquivos, dependendo da configuracao
do provedor e' necessario adicionar essa permissao na pasta. Geralmente isso pode ser feito por voce
mesmo no gerenciador de arquivos do seu painel de controle ou pelo seu programa de FTP com o chmod 0777
Na TeHospedo (http://tehospedo.com.br/), que e' o provedor onde trabalho, esse procedimento nao e' necessario nem no Windows
nem no Linux

**/

// essa variavel e' o seu dominio
define("URL_SITE", 'http://seusite.com.br'); # ----> nao ponha / no final

/******* configuracao para linux **********/
// em linux na TeHospedo apenas altere meuUserdeFTP:
define("PASTA_CACHE", '/home/meuuserdeFTP/public_html/miniaturas/'); 

/******* configuracao para windows ********/
// em windows na TeHospedo descomente a linha abaixo e mude apenas o meuDominio.com.br:
// mesmo em windows, nao use \ para separar diretorios, use / que e' mais facil
// se descomentar a linha abaixo comente o define anterior
//
// define("PASTA_CACHE", 'd:/domains/meuDominio.com.br/wwwroot/miniaturas/');  

/******* configuracao tanto para windows quanto para linux ******/
// a URL abaixo deve corresponder ao endereco web da PASTA_CACHE
define('URL_CACHE', 'http://seusite.com.br/miniaturas'); # ---> nao ponha / no final

// se for uma grande quantidade de arquivos, e' interessante deixar true
// assim, ira separar as miniaturas em subpastas
define('USAR_MULTI_DIRETORIOS', true);

////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////
////////////////////// NAO EDITE ABAIXO /////////////////////////

/******** tratamento de variaveis *********/
$url = URL_SITE . '/' . $_REQUEST['foto'];

$width = (int)$_REQUEST['width'];

$width = 143;

// nome dos arquivos que sera usado dentro da pasta de cache
$arquivo = sprintf("%s-%d.jpg",
  md5($url),
  $width
);

if (USAR_MULTI_DIRETORIOS == true) {
	// nome do arquivo com multiplos diretorios
	$arquivo_full = sprintf("%s/%s/%s",
	   substr($arquivo, 0, 2),
	   substr($arquivo, 2, 2),
	   $arquivo
	);
} else {
 	// nome do arquivo sem multiplos diretorios
	$arquivo_full = $arquivo;
}

// path e url do arquivo completa
$arquivo_path = sprintf("%s/%s", PASTA_CACHE, $arquivo_full);
$arquivo_path = str_replace("//", "/", $arquivo_path); // substitui // por /
$arquivo_url  = sprintf("%s/%s", URL_CACHE, $arquivo_full);
$arquivo_path_tmp = $arquivo_path . '.tmp';

/*

printf("full: %s\n", $arquivo_full);
printf("path: %s\n", $arquivo_path);
printf("url: %s\n", $arquivo_url);
*/

if (file_exists($arquivo_path)) { // arquivo existe, vamos apenas redirecionar para ele
	header(sprintf("Location: %s", $arquivo_url));
	exit;
}

// miniatura nao existe, vamos gerar!

// gerar subdiretorio se for usado este metodo
if (USAR_MULTI_DIRETORIOS == true) {
	$dir_level_1 = sprintf("%s/%s",
		PASTA_CACHE,
	        substr($arquivo, 0, 2)
	);

	$dir_level_2 = sprintf("%s/%s/%s",
		PASTA_CACHE,
	        substr($arquivo, 0, 2),
		substr($arquivo, 2, 2)
	);

	// subdiretorio nao existe, cria
	if (!file_exists($dir_level_1)) {
		mkdir($dir_level_1);
	}

	if (!file_exists($dir_level_2)) {
		mkdir($dir_level_2);
	}
}

// efetuar download da miniatura num arquivo tmp
$fp = fopen($arquivo_path_tmp, 'w');

// abre o arquivo
$dados = file_get_contents($url);
if ($dados === false) {
	die("nao posso abrir o arquivo\n\n");
}

fwrite($fp, $dados);

// gerar o thumb

$i = new imagethumbnail();
$i->open($arquivo_path_tmp); // coloque aqui o nome do arquivo original
$i->setX($width);
$i->imagejpeg($arquivo_path, 70);

unlink($arquivo_path_tmp);

if (file_exists($arquivo_path)) { // arquivo existe, vamos apenas redirecionar para ele
	header(sprintf("Location: %s", $arquivo_url));
	exit;
} 

die("Algum erro ocorreu");

    class imagethumbnail {

        var $filename;
        var $x;
        var $y;
        var $image;
        var $thumbnail;

        function open($filename) {

            $this->filename = $filename;
            $imageinfo = array();
            $imageinfo = getimagesize($this->filename,$imageinfo);

            $this->old_x = $imageinfo[0];
            $this->old_y = $imageinfo[1];

            switch ($imageinfo[2]) {
                case "1": $this->image = imagecreatefromgif($this->filename); break;
                case "2": $this->image = imagecreatefromjpeg($this->filename); break;
                case "3": $this->image = imagecreatefrompng($this->filename); break;
            }

        }

        function setX($x="") {
            if (isset($x)) { $this->x = $x; }
            return $this->x;
        }

        function setY($y="") {
            if (isset($y)) { $this->y = $y; }
            return $this->y;
        }

        function generate() {

            if ($this->x > 0 and $this->y > 0) {
                $new_x = $this->x;
                $new_y = $this->y;
            } elseif ($this->x > 0 and $this->x != "") {
                $new_x = $this->x;
                $new_y = ($this->x/$this->old_x)*$this->old_y;
            } else {
                $new_x = ($this->y/$this->old_y)*$this->old_x;
                $new_y = $this->y;
            }

            $this->thumbnail = imagecreatetruecolor($new_x,$new_y);
            $white = imagecolorallocate($this->thumbnail,255,255,255);
            imagefill($this->thumbnail,0,0,$white);

            imagecopyresampled ( $this->thumbnail, $this->image, 0, 0, 0, 0, $new_x, $new_y, $this->old_x, $this->old_y);

        }

        function imagejpeg($filename="",$quality=100) {
            if (!isset($this->thumbnail)) { $this->generate(); }
            imagejpeg($this->thumbnail,$filename,$quality);
        }

    }

?>