4

我们使用超长哈希在我们的应用程序中注册新用户。问题是这些哈希在某些电子邮件客户端中中断 - 使链接无法使用。

我尝试通过一个简单的调用来实现 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

}

4

5 回答 5

3

您可能希望使用urlencode()作为url参数。

也建议fgets()对照false. 然后,您可以empty()通过将响应与空字符串进行比较来保存函数调用,例如:

$line = fgets($fp);

if ($line !== false && $line !== '') {
    // ...
}

通常,false如果函数返回不同类型的值(例如integeror ),建议先检查所有内容boolean。这可能是至关重要的,因为在比较中的意思是相同的0false由于 PHP 缺乏类型安全性,强烈建议始终检查类型相等性。甚至在某些情况下,文档明确建议这样做,例如在strpos()的情况下。同时,我强迫自己使用===over to ==,同样用于 `!=' 等。它需要更多的输入,但绝对值得付出努力,因为你消除了可能的陷阱。

你的其余代码对我来说看起来不错。

于 2010-03-31T01:34:39.077 回答
0

您可以尝试bit.ly服务。据我所知,它由谷歌支持。

api

于 2010-01-12T15:59:14.880 回答
0

我不知道您的哈希到底有多长,但并非所有服务(浏览器、服务器等)都可以处理超过 255 个字符的 URL。你可以看看 php 的 Pack()

于 2010-01-12T16:08:44.130 回答
0

如果您立即将其缩短为 7-8 个字符的 tinyurl,那么使用“超长哈希”有什么意义?

没有人会费心猜测长哈希,而是破解 tinyurl。

自己使用 10 个字符的散列,比现在更安全。

于 2010-04-03T12:37:36.413 回答
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 不允许我发布答案。

于 2021-04-08T00:02:54.100 回答