Como Fazer Encurtador de URL com PHP

Já tentou imaginar como é feito um encurtador de urls? Se você não sabe o que é um encurtador de urls, estou falando de sites do tipo: bit.ly, migre.me, goo.gl, etc. Esses sites permitem usuários reduzirem urls longas utilizando algum script e neste artigo vou te mostrar uma ideia de como fazer encurtador de url com PHP.

Um url longo, tipo este aqui: https://andersonmakiyama.com/como-fazer-encurtador-de-url-com-php

Pode ser reduzido para algo do tipo: https://goo.gl/sMtnWa

Ao acessar o url reduzido, o site redutor redireciona o internauta para o url comprido.

Como Fazer Encurtador de URL com PHP

Uma ideia é você criar um banco de dados com uma tabela com três colunas: id, url_curta, url_longa, id_usuario. Aí teríamos:

id: O identificador primário da tabela que deverá ser gerado automaticamente através do atributo auto_increment.

url_curta: A url reduzida

url_longa: A url comprida

id_usuario: O Identificador do usuário que criou a tabela.

Isso funcionaria da seguinte forma:

a) Você, primeiro inseriria um novo registro na tabela, passando apenas a url_longa e o id_usuario.

b) O Mysql geraria o ID automaticamente, mas é claro que será um ID de base 10. Você pega o id gerado pelo mysql.

c) Você usa a função base_convert e converte o ID para um número alfanumérico. Dessa forma: base_convert($num, 10,36)

d) Você salva o número alfanumérico no banco de dados atualizando o próprio registro que corresponda ao id respectivo.

Com esta ideia você obterá urls encurtados do tipo http://dominio/a1se5g. O único problema aqui é que o teu script não irá trabalhar com as Letras maiúsculas, o que reduzirá o potencial de encurtamento bruscamente, conforme o numero de urls encurtados vai crescendo. Para resolver este problema, veja a segunda ideia para criar teu redutor de url no PHP.

Criar Redutor de link PHP: Ideia 02

A segunda ideia é você usar uma variável que contenha os números e as letras minúsculas e maiúsculas e calcular manualmente qual é o próximo número da sequência. A tabela conteria as mesmas colunas: id, url_curto, url_longo, id_usuario

A lógica agora seria a seguinte:

a) Você insere um novo registro informando o url_longo e o id do usuário.

b) O Mysql geraria o id automaticamente, mas agora ele só servirá de referência ao registro. Você pega o ID único gerado

c) Você pega o url_curto do ID anterior. No caso, se o id gerado pelo mysql foi o número 505, você faz nova consulta sql e pega o url_curto do registro com ID 504.

d) Agora você calcula o próximo número da sequência (url_curto) e salva o resultado no banco de dados, atualizando o registro 505.

Veja o código que criei aqui para calcular o próximo número:

function anderson_makiyama_get_next_alphanumeric($codigo){
$chars = str_split(“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ”);
$codi_array = str_split($codigo);
//Inicia uma busca pelo próximo caractere passível de incremento, ou seja, diferente de Z
//Note que inicia do último caractere para o primeiro
for($i = count($codi_array)-1;$i>-1;$i–){
if($codi_array[$i] == “Z”){
if($i==0){
//Se for igual a Z e for o primeiro caractere, então aumenta o comprimento e zera
$codi_array = array_fill(0,count($codi_array) + 1,0);
return implode(“”,$codi_array);
}else{
if($codi_array[$i -1] != “Z”){
//Se o caractere anterior for diferente de Z, incrementa-o e zera o atual e os subsequentes
//Se o caractere anterior for o primeiro, também funciona, pois incrementa ele e zera os demais
$codi_array[$i -1] = $chars[array_search($codi_array[$i -1],$chars) + 1];
for($j = $i; $j < count($codi_array); $j++){ $codi_array[$j] = 0; } return implode("",$codi_array); } } }else{ //calcula o próximo caractere, ou seja, incrementa o atual $codi_array[$i] = $chars[array_search($codi_array[$i],$chars) + 1]; if($i == 0){ //Se for o primeiro caractere, significa que os demais são z //Ou seja, zera eles $novo_array = array_fill(0,count($codi_array),0); $novo_array[0] = $codi_array[$i]; $codi_array = $novo_array; } return implode("",$codi_array); } } } [/code]O Código está comentado, mas se ficar alguma dúvida, deixe comentário que eu tento esclarecer, okay? Sigamos...A função acima anderson_makiyama_get_next_alphanumeric() deve ser chamada passando com parâmetro o número alfanumérico que é exatamente o url_curto do ID anterior que você pegou no banco de dados. A função irá calcular o próximo número e o retornará para você.Veja um exemplo:[code] $proximo_url_curto = anderson_makiyama_get_next_alphanumeric($url_curto_anterior); [/code]

Considerações a respeito do Encurtador

É sabido que a maioria dos encurtadores permitem o visitante encurtar um url sem fazer um cadastro no site. Com isso, como salvar o id usuario na tabela dos urls? A dica é salvar na tabela colocando como id_usuario o valor 0. A partir daí, no teu script redutor de url, quando o id do usuario for 0 na tabela, você já sabe que se trata de um url encurtado sem usuario cadastrado.

Outra dica é: verifique se o url longo já não está cadastrado no banco, caso positivo, retorne o url curto já existente em vez gastar mais espaço do teu banco encurtando o mesmo url. Note que isso é válido para urls encurtadas sem usuário, ou seja: com id_usuario igual a zero. Se um usuario fez um cadastro e encurtou um url, é provavel que outros usuarios tenham encurtado o mesmo url, mas ambos os urls devem ser inseridos no banco de dados, pois a qualquer momento um dos usuarios poderá excluir o url que ele cadastrou e se você usar o mesmo registro do banco, o outro usuário perderá o url encurtado por ele. O que você pode e até deve fazer é verificar se o mesmo usuario já encurtou um url que esteja querendo encurtar, neste caso, caso seja encontrado o url no banco e com o mesmo id_usuario, então apenas retorne o url curto já existente.

Fica a dica! Até o próximo artigo aqui no blog.

Como Fazer Encurtador de URL com PHP
4.8 (96.36%) 44 votes

Leave a Reply