Скрипт PHP для сокращения ссылок. Shortening links

Сперва напишем простой код, для генерации простого рандома символов, чтобы наша ссылка могла выглядеть примерно вот так: https://domain.tld/fw3IwO

Код нашего рандома:

function generatePassword($length = 0){
    $chars = 'qazwsxedcrfvtgbyhnujmikolpQAZWSXEDCRFVTGBYHNUJMIKOLP1234567890-_'; 
    $numChars = strlen($chars);
    $string = '';
    for ($i = 0; $i < $length; $i++) {
        $string .= substr($chars, rand(1, $numChars) - 1, 1);
    }
    return $string;}
$gename = generatePassword(8);
Стоит заметить что переменная $gename будет выводить рандомно 8 символов которые указаны в переменной $chars. Но как по мне это не очень хорошо, давайте сделаем так чтобы рандомно генерировало не только 8 символов, а скажем, от 5 до 8. Добавим переменную в начале:
$rand = rand(5, 8);
И запишем её в generatePassword. Теперь скрипт рандома выглядит вот так:
$rand = rand(5, 8);
function generatePassword($length = 0){
    $chars = 'qazwsxedcrfvtgbyhnujmikolpQAZWSXEDCRFVTGBYHNUJMIKOLP1234567890-_'; 
    $numChars = strlen($chars);
    $string = '';
    for ($i = 0; $i < $length; $i++) {
        $string .= substr($chars, rand(1, $numChars) - 1, 1);
    }
    return $string;}
$gename = generatePassword($rand);
Хорошо. Решил делать скрипт, который не использует базу данных, по этому логика будет такова: пользователь пишет в текстовое поле ссылку и нажимает кнопку сократить ссылку. Его ссылка записывается в простой файлик html с кодом перенаправления на его ссылку, название файла html генерирует наш рандом. По этому создаём простую форму с созданием файла и записью:
    echo '<form method="post">
    <input type="text" class="text" name="link" placeholder="Ссылка"><input type="submit" class="btn btn-success" id="button" name="send" value="Сократить"></form>';
    if (isset($_REQUEST['send'])){
     if ( $_POST["link"]){
        $link=$_POST['link'];
            $fp = fopen("$gename.html", "a");
            $mytext = "<head><meta http-equiv='refresh' content='1;URL=$link' /></head>";
            $result = fwrite($fp, $mytext);
            fclose($fp);
            echo "Готово!;
        } else {
            echo("Что-то пошло не так. ");
    }}
А если пользователь введёт не ссылку, а что-то другое? Нужно добавить проверку с помощью FILTER_SANITIZE_URL:
    echo '<form method="post">
    <input type="text" class="text" name="link" placeholder="Ссылка"><input type="submit" class="btn btn-success" id="button" name="send" value="Сократить"></form>';
    if (isset($_REQUEST['send'])){
     if ( $_POST["link"]){
        $link=$_POST['link'];
        $link = filter_var($link, FILTER_SANITIZE_URL);
        if (!filter_var($link, FILTER_VALIDATE_URL) === false) {
            $fp = fopen("$gename.html", "a");
            $mytext = "<head><meta http-equiv='refresh' content='1;URL=$link' /></head>";
            $result = fwrite($fp, $mytext);
            fclose($fp);
            echo "Ваша ссылка: https://$hostname/$gename";
        } else {
            echo("Ссылка, которую Вы ввели не является правильной!");
    }}}
Теперь остаётся прописать в файл .htaccess строки для удаления .html в конце ссылок:
RewriteEngine On 
RewriteCond %{REQUEST_URI} ! \.html$ 
RewriteCond %{REQUEST_URI} ! /$ 
RewriteRule ^(.*)$ $1.html
Вот и всё. Можно также дописать скрипт удаления старых ссылок, которые существую больше 24-х часов:
$dir = "./";
$files = scandir( $dir );
$time = time();
$life_file = 86400; 
$time = $time - $life_file;
$ignore = array('.', '..', basename(__FILE__), 'index.php', '.htaccess', 'style.css');
foreach( $files as $file )
{
    if( !in_array($file, $ignore) )
    {
    $file = $dir.$file;
    $filemtime = filemtime( $file ); 
    if( $filemtime <= $time )
    {
    unlink( $file );
}}}
Обратите внимание, в переменную $ignore  нужно прописать файлы, которые не нужно удалять, а в переменной $life_file  указываем время существования файлов.
Удачи 🙂
Полный скрипт выгляди вот так:
<?php 
$rand = rand(5, 8);
function generatePassword($length = 0){
    $chars = 'qazwsxedcrfvtgbyhnujmikolpQAZWSXEDCRFVTGBYHNUJMIKOLP1234567890-_'; 
    $numChars = strlen($chars);
    $string = '';
    for ($i = 0; $i < $length; $i++) {
        $string .= substr($chars, rand(1, $numChars) - 1, 1);
    }
    return $string;}
$hostname = $_SERVER['SERVER_NAME'];
$gename = generatePassword($rand);

    echo '<form method="post">
    <input type="text" class="text" name="link" placeholder="Ссылка"><input type="submit" class="btn btn-success" id="button" name="send" value="Сократить"></form>';
    if (isset($_REQUEST['send'])){
     if ( $_POST["link"]){
        $link=$_POST['link'];
        $link = filter_var($link, FILTER_SANITIZE_URL);
        if (!filter_var($link, FILTER_VALIDATE_URL) === false) {
            $fp = fopen("$gename.html", "a");
            $mytext = "<head><meta http-equiv='refresh' content='1;URL=$link' /></head>";
            $result = fwrite($fp, $mytext);
            fclose($fp);
            echo "Ваша ссылка: https://$hostname/$gename";
        } else {
            echo("Ссылка, котору. Вы ввели не является правильной!");
    }}}

$dir = "./";
$files = scandir( $dir );
$time = time();
$life_file = 86400; 
$time = $time - $life_file;
$ignore = array('.', '..', basename(__FILE__), 'index.php', '.htaccess', 'style.css');
foreach( $files as $file )
{
    if( !in_array($file, $ignore) )
    {
    $file = $dir.$file;
    $filemtime = filemtime( $file ); 
    if( $filemtime <= $time )
    {
    unlink( $file );
}}}
?>
Оставьте ответ