Пример Tinyurl API - правильно ли я делаю: D - PullRequest
4 голосов
/ 12 января 2010

мы используем супердлинные хэши для регистрации новых пользователей в нашем приложении. Проблема в том, что эти хеши взламываются на некоторых почтовых клиентах, что делает ссылки непригодными для использования.

Я пытался реализовать Tinyurl - API с помощью простого Call, но иногда мне кажется, что время ожидания истекло ... иногда почта не доходит до пользователя.

Я обновил код, но теперь URL никогда не конвертируется. Тинюрл действительно такой медленный или я делаю что-то не так? (Я имею в виду, эй, 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

}

Ответы [ 5 ]

3 голосов
/ 31 марта 2010

Возможно, вы захотите использовать urlencode () для параметра url.

Также рекомендуется проверять fgets() против false. Затем вы можете сохранить вызов функции empty(), просто сравнив ответ с пустой строкой, например:

$line = fgets($fp);

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

Как правило, рекомендуется сначала проверить все по false, если функция возвращает значения различных типов, например integer или boolean. Это может иметь решающее значение, потому что 0 и false означают в сравнениях то же самое. Из-за отсутствия в PHP безопасности типов настоятельно рекомендуется всегда проверять равенство типов. Есть даже случаи, когда документация рекомендует это явно, например, в случае strpos () . Тем временем я заставил себя использовать === для ==, то же самое для `! = 'И т. Д. Это требует большего набора текста, но это определенно стоит усилий, потому что вы устраняете возможные ловушки.

Остальная часть вашего кода выглядит хорошо для меня.

0 голосов
/ 03 апреля 2010

Какой смысл использовать «супер-длинный хеш», если вы сразу сокращаете его до 7-8-символьного крошечного?

Никто бы не стал угадывать длинный хэш, и вместо этого взломал бы крошку.

Используйте 10-символьный хеш самостоятельно и будьте более безопаснее, чем вы сейчас.

0 голосов
/ 12 января 2010

Я не знаю точно, как долго ваш хеш, но не все службы (браузеры, серверы и т. Д.) Могут обрабатывать URL-адреса длиннее 255 символов. Вы можете посмотреть в php's Pack ()

0 голосов
/ 26 марта 2010

хорошее решение, а первое действительно ужас: D

0 голосов
/ 12 января 2010

Вы можете попробовать bit.ly услугу. Это поддерживается Google, как я знаю.

Api

...