Separando o nome e o endereço em uma URL com PHP

O Problema:

Aqui na empresa temos um sistema em PHP que trabalha com URLs https autenticadas, no formato https://usuario:password@endereco. O sistema baixa arquivos, processa e exibe resultados, repetindo o ciclo a cada 15 segundos. O programador que o desenvolveu utilizava chamadas padrão (do tipo fopen($URL, "r") para baixar os arquivos. O problema é que como os servidores são acessados via internet, temos todo um problema de timeouts. O timeout padrão do PHP é alto (uns 60 segundos) e como são vários servidores a serem acessados, o sistema leva 10 minutos entre as checagens, devido a vários timeouts na sequência. Visando resolver esse problema, pesquisei e encontrei a libcurl, que permite um controle maior sobre os parâmetros de timeout (e vários outros) e faz parte do PHP na maioria das distribuições Linux . Mas havia um problema: a libcurl não reconhece o formato de URL acima (https://usuario:password@endereco), sendo necessário informar o usuário e senha separados da URL, e o banco de dados do sistema já estava configurado e alimentado nesse formato.

A Solução:

Desenvolvi duas funções: uma que retorna apenas o conjunto usuario:password da URL (suprimindo o endereço) , e outra que retorna apenas o endereço da URL (suprimindo o usuário e password.

As Funções:


Abaixo estão as funções, relativamente comentadas. (testadas em PHP 5.2)

function extrair_User_Pass($URL)
{
//Inverte a string, pega tudo entre o primeiro '@' e as '//' e joga no Array "$arr1"
preg_match("'@.*\b//'",strrev($URL),$arr1);

//Converte a String em "$arr1[0]" em um array, inverte sua ordem e armazena em "$arr1"
$arr1 = array_reverse(str_split($arr1[0]));

//Retira o '@' e as '//'
array_shift($arr1);
array_shift($arr1);
array_pop($arr1);

return implode($arr1);
}
function extrair_URL($URL)
{
return preg_replace("/".extrair_User_Pass($URL)."@/","",$URL);
}

Explicação:

A primeira função (extrair_User_Pass) recebe uma string contendo a URL e retorna uma string com o usuário e a senha no formato requerido pela libcurl (usuario:password), desprezando o restante.

A segunda função (extrair_URL) faz exatamente o oposto: também recebe uma string com uma URL e retorna apenas a parte de endereço e protocolo, desprezando as informações de usuário e senha. Note que a segunda função utiliza a primeira.

Nenhum comentário: