我们在应用程序中使用超长哈希来注册新用户。问题是这些哈希在一些电子邮件客户端中断 - 使链接无法使用。
我尝试使用简单的呼叫实现Tinyurl-API,但我认为它有时会超时...有时邮件无法到达用户。
我更新了代码,但现在永远不会转换URL。 Tinyurl真的这么慢还是我做错了什么? (我的意思是嘿,5秒钟在这个时代很多)
有人可以推荐我更可靠的服务吗?
我所有的错,在fopen中忘记了一个错误。但我会在这里留下这个代码示例,因为我经常看到这个样本,我觉得这样做不太可靠:
return file_get_contents('http://tinyurl.com/api-create.php?url='.$u);
这是 - 我认为完全可行的样本。我想听听改进。
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
}
答案 0 :(得分:3)
您可能希望将urlencode()用于url
参数。
建议fgets()
对false
进行检查。然后,您可以通过比较对空字符串的响应来保存empty()
函数调用,例如:
$line = fgets($fp);
if ($line !== false && $line !== '') {
// ...
}
通常,如果函数返回不同类型的值(例如false
或integer
),建议首先检查boolean
的所有内容。这可能至关重要,因为0
和false
在比较中意味着相同。由于PHP缺乏类型安全性,强烈建议始终检查类型是否相等。甚至有些文档明确建议这样做,例如在strpos()的情况下。同时,我强迫自己使用===
到==
,同样用于`!='等等。它需要更多打字,但绝对值得努力,因为你消除了可能的陷阱。
其余代码对我来说很好。
答案 1 :(得分:0)
答案 2 :(得分:0)
我不知道您的哈希值到底有多长,但并非所有服务(浏览器,服务器等)都可以处理超过255个字符的URL。您可以查看php's Pack()
答案 3 :(得分:0)
很好的解决方案,第一个真的很恐怖:D
答案 4 :(得分:0)
使用“超长哈希”有什么意义,如果你立即将它缩短为7-8个字符的小字号?
没有人会因为猜测长哈希而烦恼,而是会破解这个小小的。
自己使用10个字符的哈希,并且更多比现在更安全。
答案 5 :(得分:0)
这是另一个版本:
function getTinyUrl($url)
{
$ch = curl_init();
$timeout = 5;
curl_setopt($ch, CURLOPT_URL,'http://' . 'tinyurl.com/api-create.php?url=' . $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$tinyUrl = curl_exec($ch);
curl_close($ch);
if ($tinyUrl === false) {
throw new RuntimeException("Could not create URL");
}
return $tinyUrl;
}
我不得不拆分 tinyurl 网址,因为 SO 不允许我发布答案。