TinyURL. Шаг 5. Последние штрихи и запуск

До запуска сервиса коротких собщений осталось совсем немного: определиться с хранением информации, настроить .htaccess и переадресацию.

Ссылка на архив TinyURL для нетерпеливых (Инструкция по установке и ссылка на пример работающего скрипта в конце статьи)

Для кодирования, как я уже упоминал раньше будет испльзовано множество символов [A-Za-z0-9], которое позволяет получить чуть меньше полутора миллионов уникальных кодов. Неразуно хранить такой объем данных в одном файле, а потому я разобью код на две равные части, первая из которых будет служить именем файла, а вторая индексом массива, который в этм файле сохранен. То есть код aF0k, говорит о том, что надо загрузить файл с именем aF и найти в нем элемент с индексом 0k

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

Итак, функция получения случайного кода и сохранения пльзовательской ссылки.

  1.  
  2. function tinyurl_addurl($url)
  3. {
  4. global $tinyurl_key;
  5. global $tinyurl_base;
  6. $len = 2; //magic number - filename/index length
  7. $fname = tinyurl_encode(
  8. $tinyurl_key, rand(0, pow($tinyurl_base, $len) - 1), $len);
  9. $_array = array();
  10. @include("urls/$fname.php");
  11. $cnt = count($_array);
  12. if($cnt < pow($tinyurl_base, $len))
  13. {
  14. $index = tinyurl_encode($tinyurl_key, $cnt, $len);
  15. $_array[$index] = $url;
  16. $res = $fname . $index;
  17. arraytofile($_array, "urls/$fname.php");
  18. }
  19. return $res;
  20. }
  21.  

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

  1.  
  2. '!(http|ftp|https):\/\/[\w\-_]+(\.[\w\-_]+)+([\w\-\.,@?^=%&:/~\+#]*[\w\-\@?^=%&/~\+#])?!i',
  3. $url))
  4. {
  5. $json['err'] = 'Неверный формат URL';
  6. $json['status'] = 'FAILED';
  7. break;
  8. }
  9. $lnk = '';
  10. while($lnk == '')
  11. {
  12. $lnk = tinyurl_addurl($url);
  13. }
  14. $json['lnk'] = 'http://' . $_SERVER['SERVER_NAME']
  15. . dirname($_SERVER['SCRIPT_NAME']) . "/$lnk";
  16. $json['status'] = 'SUCCESS';
  17.  

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

Теперь перейдем к поиску ссылки по ее коду и перенаправлению пользователя если таковая найдена

  1.  
  2. $query = substr($_SERVER['QUERY_STRING'], 0, 4);
  3. if(!preg_match('#[A-Za-z0-9]{4}#', $query))
  4. {
  5. $query = substr($_SERVER['REQUEST_URI'],
  6. strpos($_SERVER['REQUEST_URI'], '/', 1) + 1, 4);
  7. }
  8. if(preg_match('#[A-Za-z0-9]{4}#', $query))
  9. {
  10. $keys = str_split($query, 2);
  11. $fname = "urls/{$keys[0]}.php";
  12. if(file_exists($fname))
  13. {
  14. @include($fname);
  15. if(isset($_array[$keys[1]]))
  16. {
  17. header ("Location: {$_array[$keys[1]]}");
  18. }
  19. }
  20. }
  21.  

Немного шаманства c .htaccess (я разместил сервис в папке tinyurl - отсюда и значение RewriteBase) ...

  1.  
  2. AddHandler application/x-httpd-php .php .html
  3.  
  4. php_flag magic_quotes_gpc 0
  5. php_flag register_globals off
  6.  
  7. RewriteEngine on
  8. RewriteBase /tinyurl/
  9.  
  10. Options -Indexes
  11. Options +FollowSymlinks
  12.  
  13. RewriteCond %{THE_REQUEST} !^(.+)(index|ajax)\.php(.*)$
  14. RewriteRule .* index.php
  15.  

... настройка пользовательской формы, незначительное причесывание кода и сервис готов.

Пример работающего сервиса

То, что получилось, качаем здесь.

Установка

  • Скачайте дистрибутив и загрузите его содержимое на сервер.
  • Поправьте в .htaccess имя папки, заменив tinyurl на нужное вам значение.
  • Удалите файл about.php, предварительно ознакомившись с ним.
  • Если на вашем сервере установлен PHP 5, тогда смело стирайте php4.php.
  • Удалите содержимое папки urls и выставьте для нее права на запись.
  • Если это возможно оставьте ссылку на этот блог на вашей странице.

    P.S. Сегодня обнаружил, что у меня неправильно настроена RSS лента. Все исправил, так что подписывайтесь - впереди еще много интересного.

    Читайте в блоге

    TinyURL. Шаг 4. Обработка кнопки на примере формы входа
    TinyURL. Шаг 3. Рендеринг интерфейса
    TinyURL. Шаг 2. Кодирование и декодирование ссылки
    Разноцветное облако ссылок
    Установка собственного OpenID сервера phpMyID

  • Комментарии:

    Владимир Рыбаков @ 09.11.2009 17:36

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

    http://www.codenothing.com/archives/jquery/inline-text-edit/
    http://blog.termit.name/jquery/

    P.S. Надо бы переписать эту форму.
    Владимир Рыбаков @ 10.11.2009 17:20

    Еще одна полезная ссылка. На сей раз об использовании canvas

    http://www.linkexchanger.su/2009/86.html
    Владимир Рыбаков @ 10.11.2009 21:16

    Очередное изменение в системе комментирования и очередная проверка.
    Sect0R @ 31.10.2010 00:27

    Спасибо за скрипт
    NnpctO @ 01.11.2010 02:39

    Ну, нифига и этот скрипт бесплатно??? Вот уж не ожидал, что так подфартит. Дело в том, что я поднял несколько доменов в сервисах, где стоит подобный скрипт и там в этих сервисах показатели солидные тИЦастые и PRистые домены короче.

    Вот я и планировал организовать у себя на сервере нечто подобное, но не знал где купить этот скрипт. А тут на тебе! Ну, спасибо дружище! Как подыму деньжат с этой затеи обязательно сделаю тебе символический подгон в виде нескольких баксов..
    Sect0R @ 01.11.2010 03:29

    Согласен, скрипт классный, а тиц и пр у подобных велик.
    Вот только разрекламировать сервис сначала понадобится
    Gold-Coin @ 10.10.2011 15:32

    Установил все вроде ровно, но почему-то не только не пашет, но и на 404 отправляет. Может хостер быкует по этому поводу?
    Sect0R @ 10.10.2011 15:41

    Проверь поддержку htaccess у хостера
    Сергей @ 14.01.2012 21:29

    За скрипт огромное спасибо! Сейчас будем пробовать.

    Войдите на сайт, чтобы оставить комментарий