Exemplo de API Tinyurl - estou fazendo certo: D
Pergunta
Usamos hashes super longos para o registro de novos usuários em nosso aplicativo. O problema é que esses hashes quebram em alguns clientes de email - tornando os links inutilizáveis.
Tentei implementar a API TinyUrl - com uma chamada simples, mas acho que às vezes se destaca ... às vezes o e -mail não chega ao usuário.
Atualizei o código, mas agora o URL nunca é convertido. Tinyurl é realmente tão lento ou estou fazendo algo errado? (Quero dizer, ei, 5 segundos são muito nesse momento)
Alguém pode me recomendar um serviço mais confiável?
Toda a minha culpa, esqueci um falso no fope. Mas vou deixar esta amostra de código aqui, porque muitas vezes vejo esta amostra, o que acho que não funciona muito confiável:
return file_get_contents('http://tinyurl.com/api-create.php?url='.$u);
Esta é a amostra - acho que está funcionando totalmente. Eu gostaria de ouvir sobre melhorias.
static function gettinyurl( $url ) {
$context =
stream_context_create(
array(
'http' => array(
'timeout' => 5 // 5 Seconds should be enough
)
)
);
// get tiny url via api-create.php
$fp = fopen( 'http://tinyurl.com/api-create.php?url='.$url, 'r', $context); // open (read) api-create.php with long url as get parameter
if( $fp ) { // check if open was ok
$tinyurl = fgets( $fp ); // read response
if( $tinyurl && !empty($tinyurl) ) // check if response is ok
$url = $tinyurl; // set response as url
fclose( $fp ); // close connection
}
// return
return $url; // return (tiny) url
}
Solução
Você pode querer usar urlencode () para o url
parâmetro.
Também é recomendável verificar fgets()
contra false
. Então, você pode salvar o empty()
Chamada de função apenas comparando a resposta a uma string vazia, como:
$line = fgets($fp);
if ($line !== false && $line !== '') {
// ...
}
Geralmente, é aconselhável verificar tudo contra false
Primeiro, se a função retornar valores de diferentes tipos, como integer
ou boolean
. Isso pode ser crucial porque 0
e false
significa em comparações iguais. Devido à falta de segurança do tipo PHP, é altamente recomendável verificar sempre a igualdade do tipo. Existem até casos em que a documentação recomenda isso explicitamente, por exemplo, no caso de strpos (). Enquanto isso, eu me forcei a usar ===
para ==
, o mesmo para `! = 'etc. Requer mais digitação, mas definitivamente vale o esforço porque você elimina possíveis armadilhas.
O resto do seu código parece bom para mim.
Outras dicas
Não sei exatamente quanto tempo seu hash, mas nem todos os serviços (navegadores, servidores etc.) podem lidar com URLs com mais de 255 chars. Você poderia olhar para pacote de php ()
boa solução, e a primeira é realmente um horror: D
Qual é o sentido de usar um "hash super longo", se você o está diminuindo imediatamente para um Tinyurl de 7-8 de personagem?
Ninguém se incomodaria em adivinhar o hash longo e quebraria o Tinyurl.
Use um hash de 10 caracteres e seja mais Seguro do que você agora.