Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Tinyurl API示例-我做得对吗:D_Php_Api_Tinyurl - Fatal编程技术网

Php Tinyurl API示例-我做得对吗:D

Php Tinyurl API示例-我做得对吗:D,php,api,tinyurl,Php,Api,Tinyurl,我们在应用程序中使用超长散列来注册新用户。问题是,这些散列在一些电子邮件客户端中断-使链接无法使用 我试着用一个简单的调用实现Tinyurl-API,但我认为它有时会超时。。。有时邮件无法送达用户 我更新了代码,但现在URL从未转换。Tinyurl真的这么慢还是我做错了什么?(我的意思是,嘿,在这个时候5秒是很重要的) 有人能给我推荐一种更可靠的服务吗 都是我的错,忘了一个假的。但我将把这个代码示例留在这里,因为我经常看到这个示例,我认为它的工作不太可靠: return file_get_con

我们在应用程序中使用超长散列来注册新用户。问题是,这些散列在一些电子邮件客户端中断-使链接无法使用

我试着用一个简单的调用实现Tinyurl-API,但我认为它有时会超时。。。有时邮件无法送达用户

我更新了代码,但现在URL从未转换。Tinyurl真的这么慢还是我做错了什么?(我的意思是,嘿,在这个时候5秒是很重要的)

有人能给我推荐一种更可靠的服务吗

都是我的错,忘了一个假的。但我将把这个代码示例留在这里,因为我经常看到这个示例,我认为它的工作不太可靠:

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
}您可以试试这项服务。据我所知,它得到了谷歌的支持


我不知道您的哈希值到底有多长,但并非所有服务(浏览器、服务器等)都能处理长度超过255个字符的URL。您可以查看您可能希望用于
url
参数的

还建议检查
fgets()
是否为
false
。然后,只需将响应与空字符串进行比较,即可保存
empty()
函数调用,如:

$line = fgets($fp);

if ($line !== false && $line !== '') {
    // ...
}
通常,如果函数返回不同类型的值,例如
integer
boolean
,则建议首先检查所有内容是否为
false
。这可能很关键,因为
0
false
在比较中的意思相同。由于PHP缺乏类型安全性,强烈建议始终检查类型是否相等。甚至在某些情况下,文件明确建议这样做,例如在以下情况下。同时,我强迫自己使用
===
转换成
==
,这和“!=”一样等等。它需要更多的输入,但绝对值得付出努力,因为你消除了可能的陷阱


我觉得您的代码的其余部分很好。

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

没有人会费心去猜长的散列,而会去破解小馅饼


自己使用10个字符的散列,比现在更安全。这里是另一个版本:

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不允许我发布答案。

一个示例哈希看起来像这样,总是小于160个字符。3c853e3f2e099cb16bddc7c:D5C9886CB31F789E3CDFFD55456FE26井。。。哈希的外观不在我的域中。我只需要发送一封包含哈希的工作电子邮件。开发人员的意图是在散列中隐藏一些信息,这样我们就可以重建用户想要注册的内容等等。。。还有一个组件是加密的,所以只要没有人发现密钥,我们的哈希就相当安全。我不确定我是否理解正确,但为什么Tinyurl更容易破解或更难破解?关于Tinyurl更容易破解——如果它们只有一个10个字符的模式跟踪键,那么猜测URL(并测试它们是否重定向到您的域)将比猜测一个长哈希容易得多。但考虑到长URL本身不在您的控制之下,很抱歉造成混乱…:)