- Простой скрипт для сокращения URL-адреса
- Идея
- INI-файл
- Заключение
- Как узнать размер файла по его URL на PHP?
- Размер ссылки в php
- Фильтрация данных с помощью zend-filter
- Контекстное экранирование с помощью zend-escaper
- Подключение Zend модулей к Expressive
- Совет: отправка информации в Google Analytics через API
- Подборка PHP песочниц
- Совет: активация отображения всех ошибок в PHP
- Укорачивание ссылок средствами PHP
Простой скрипт для сокращения URL-адреса
Мне нравится решать проблемы с помощью маленьких и компактных скриптов. Чем меньше кода нужно написать, тем лучше. Недавно у меня в очередной раз появился шанс это сделать.
Требовалось встроить в PDF-документы ссылки, которые могли изменяться в будущем.
Ссылки невозможно обновить без повторной генерации и отсылки файлов. Ситуация осложнялась тем, что ссылки были достаточно длинными и набирать их вручную было очень долго по времени.
Эта проблема может быть решена с помощью скрипта для сокращения URL-адресов. Уже довольно давно существуют сервисы, предоставляющие такие возможности, но они не без недостатков. Вот некоторые из них:
- Зависимость от внешнего сервиса – когда он не работает, ссылки тоже оказываются недоступными. Еще хуже, если сервис закрывается – сами понимаете к чему это приведет;
- Вся статистика отслеживается сторонними сервисами;
- Обычно, не разрешается изменять вид укороченных ссылок;
- Некоторые сервисы позволяют выбрать свои псевдонимы, но большинство назначает их автоматически.
Итак, задача состоит в написании собственного PHP-скрипта, который был позволил решать задачу, описанную выше!
Идея
Если скрипт создается исключительно для собственного пользования, то можно опустить создание таких вещей, как регистрация пользователя и административная панель. Ниже перечислены возможности, которыми должен обладать наш будущий скрипт:
- Короткие ссылки будут иметь вид http://example.com/l/short-link . Посещение данного URL-адреса будет переадресовываться на реальный адрес;
- Весь скрипт будет располагаться в единственном файле – index.php, без внешних зависимостей;
- Панель администратора с инструментами добавления и редактирования ссылок отсутствует. Все будет управляться с помощью простого текстового файла, расположенного на сервере, который очень легко отредактировать;
- Идентификаторы не будут автоматически присваиваться ссылкам – вы сами будете вводить псевдоним.
Эти пункты упростят наш будущий скрипт. Чтобы сделать все еще более понятным, я решил хранить ссылки в INI-файле, потому что его легко отредактировать и PHP имеет их встроенную поддержку через функцию parse_ini_file (это убережет нас от необходимости читать содержимое файла и парсить его вручную, к тому же эта функция работает очень быстро).
INI-файл
google = https://www.google.com/ fb = https://www.facebook.com/
Слева короткая ссылка, а справа — длинная. Все очень просто!
Наш PHP-скрипт гениально прост:
$links = parse_ini_file('links.ini'); if(isset($_GET['l']) && array_key_exists($_GET['l'], $links)) < header('Location: ' . $links[$_GET['l']]); >else< header('HTTP/1.0 404 Not Found'); echo 'Unknown link.'; >
Скрипт ожидает получения псевдонима в массиве $_GET[‘l’] , который выглядит например так: http://example.com/index.php?l=google .
Конечно это не сокращение, но мы можем улучшить это с помощью файла .htaccess (используется для запуска веб-сервера Apache).
RewriteEngine On RewriteCond $1 !^(index.php) RewriteRule ^(.*)$ index.php?l=$1 [L]
Этот файл должен находиться в той же директории, что и index.php и links.ini . Его назначение состоит в том, чтобы перенаправлять каждый запрос, который идет НЕ к файлу index.php , на адрес вида index.php?l=xxx . Это защитит от циклических ссылок и сделает файл links.ini недоступным из браузера.
Для достижения наилучших результатов, поместите три этих файла в папку с коротким именем, к примеру « l », в корневую папку сайта, и получите короткий вид ссылок в форме http://example.com/l/google .
Пример с сайтом google.com не слишком нагляден, так как укороченная ссылка получается длиннее оригинала, однако важно было показать именно суть работы механизма, что, надеюсь, и было достигнуто.
Заключение
Если вы не хотите хранить ссылки в отдельном файле, то можете поместить их в ассоциативный массив внутри скрипта.
Еще одно улучшение, которое можно сделать, это создать простейший административный интерфейс, чтобы можно было менять содержимое INI-файла.
Конечно, в данном скрипте можно еще много чего реализовать. Надеюсь, что мое творение было для вас полезным!
Вадим Дворников автор-переводчик статьи « Quick Tip — Create a Simple URL Shortener With 10 Lines of PHP »
Как узнать размер файла по его URL на PHP?
На вашем сайте организовано хранение различного рода файлов. Одним из правильных решений будет отображение размера того или иного файла, ведь в зависимости от скорости интернета и его трафика пользователь сделает выводы – может ли он скачать этот файл сейчас или нет.
echo "Размер файла: ".$file_size; ?>
Все бы хорошо, но в таком случае мы получаем размер в байтах, а что, если мы имеем достаточно большой размер файла и число вида «1 000 000» попросту испугает пользователя?
Для этого мы напишем небольшую функцию:
function size_convert($bytes) { $bytes = floatval($bytes); $arBytes = array( 0 => array( "UNIT" => "Tb", "VALUE" => pow(1024, 4) ), 1 => array( "UNIT" => "Gb", "VALUE" => pow(1024, 3) ), 2 => array( "UNIT" => "Mb", "VALUE" => pow(1024, 2) ), 3 => array( "UNIT" => "Kb", "VALUE" => 1024 ), 4 => array( "UNIT" => "b", "VALUE" => 1 ), ); foreach($arBytes as $arItem) { if($bytes >= $arItem["VALUE"]) { $result = $bytes / $arItem["VALUE"]; $result = str_replace(".", "," , strval(round($result, 2)))." ".$arItem["UNIT"]; break; > > return $result; >
Которую внедрим в ранее написанный код. И получим уже следующую конструкцию:
function size_convert($bytes) { $bytes = floatval($bytes); $arBytes = array( 0 => array( "UNIT" => "Tb", "VALUE" => pow(1024, 4) ), 1 => array( "UNIT" => "Gb", "VALUE" => pow(1024, 3) ), 2 => array( "UNIT" => "Mb", "VALUE" => pow(1024, 2) ), 3 => array( "UNIT" => "Kb", "VALUE" => 1024 ), 4 => array( "UNIT" => "b", "VALUE" => 1 ), ); foreach($arBytes as $arItem) { if($bytes >= $arItem["VALUE"]) { $result = $bytes / $arItem["VALUE"]; $result = str_replace(".", "," , strval(round($result, 2)))." ".$arItem["UNIT"]; break; > > return $result; > echo "Размер файла: ".size_convert($file_size); ?>
В таком случае, в зависимости от размера файла, мы получим читабельное число и размерность, что значительно удобнее, нежели размер в байтах.
Размер ссылки в php
В этом разделе помещены уроки по PHP скриптам, которые Вы сможете использовать на своих ресурсах.
Фильтрация данных с помощью zend-filter
Когда речь идёт о безопасности веб-сайта, то фраза «фильтруйте всё, экранируйте всё» всегда будет актуальна. Сегодня поговорим о фильтрации данных.
Контекстное экранирование с помощью zend-escaper
Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.
Подключение Zend модулей к Expressive
Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.
Совет: отправка информации в Google Analytics через API
Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.
Подборка PHP песочниц
Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.
Совет: активация отображения всех ошибок в PHP
При поднятии PHP проекта на новом рабочем окружении могут возникнуть ошибки отображение которых изначально скрыто базовыми настройками. Это можно исправить, прописав несколько команд.
Укорачивание ссылок средствами PHP
Некоторое время назад на моём сайте возникла необходимость «обрезать» часть ссылок. Из-за их излишней длины искажались таблици сайта.
Как вы уже наверное догадались я выводил ссылки в цикле при помощи функции printf().
При этом мне нужно укоротить только название! Это делается примерно таким образом (хотя всегда могут быть вариации кода) :
$linkName = «Имя ссылки»; ///Чтобы не усложнять код я задам ссылку двумя переменными.
$linkTarget = «https://how2.org.ua/»;
$maxLength = 20; ////максимальная длина ссылки. Если она больше, значит необходимо укоротить название
if (strlen($strName) > $maxLength) $strName = substr($strName,0,$maxLength).»…»;
>
/* В переменную $strName теперь попал укороченный вариант названия с тремя символами точки в конце */
/* Можем вывести её обычным образом */
Вот и всё! В итоге мы получим ссылку укороченную до заданной в переменной $maxLength длины.
Если вы не используете имена для своих ссылок, вам необходимо продублировать переменную со ссылкой. Теперь одна из них должна остаться неизменной, а вторую следует преобразовать по методу описанному выше.
Иногда может возникнуть ситуация, когда нам необходимо показать начало и конец ссылки, выбросив её середину (чаще всего это необходимо как раз в случае не имения «имени» ссылки).
Это можно сделать таким образом:
$link = «https://how2.org.ua/view/article.php»; /// к примеру имеем такую ссылку
$new = split(‘/’, $link); ///разделим все её элементы и запишем их в массив
print_r($new); ///для наглядности выведем массив на экран
$last = count($new); /// узнаем длину массива
/* Так как мы разделяли ссылку при помощи символа ‘ / ‘ два первых элемента массива не имеют смысла! Первый содержит ‘https:’ , а второй пуст.*/
/* Из-за того, что массив начинается с нулевого элемента необходимо добавить не $last элемент, а на 1 меньший */
У меня получилось вот так:
Array
(
[0] => https:
[1] =>
[2] => how2.org.ua
[3] => view
[4] => article.php
)
https://how2.org.ua/…/article.php
Стоит отметить, что приведенная ссылка не работает. Она ссылается на несуществующую страницу и приведена сугубо для примера.
Ещё одном методом является разбиение строки-названия и вывод начала. Этот метод очень похож на первый, но используя его, мы обезопасимся себя от «случайного» изменения строки (никогда не будет недописанных слов и символов-артефактов).
Итак, разобьём строку при помощи функции split если превышена заданная длина строки:
if (strlen($last[‘title’]) > 60) $text = split(» «, $last[‘title’]); ///в качестве разделителя используем символ пробела
$title = $text[0].» «.$text[1].» «.$text[2].»…»; ///выводим 3 первых слова и троеточие
>
Такой метод естественно следует использовать для ссылок с именами.