Генерация короткой ссылки в PHP
Данный скрипт укорачивает ссылки и записывает/считывает их в базу.
class ShortURLCreator
{
protected static $chars = "123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";
// таблица БД в которую будем сохранять ссылки
protected static $table = "short_urls";
// проверка URL на наличие в базе
protected static $checkUrlExists = true;
// PDO объект
protected $pdo;
// время запуска скрипта
protected $timestamp;
// в конструктор передаем объект PDO
public function __construct(PDO $pdo) {
$this->pdo = $pdo;
$this->timestamp = $_SERVER["REQUEST_TIME"];
}
// метод преобразующий URL в короткий код
public function urlToShortCode($url)
{
// если пусто
if (empty($url)) {
throw new Exception("Нет URL!!!");
}
// проверить формат URL
if ($this->validateUrlFormat($url) == false) {
throw new Exception(
"Неправильный формат URL адреса!!!");
}
// если надо проверять URL на существование
if (self::$checkUrlExists) {
if (!$this->verifyUrlExists($url)) {
throw new Exception(
"Такого URL в базе нет!!!");
}
}
// генерируем ShortCode
$shortCode = $this->urlExistsInDb($url);
if ($shortCode == false) {
$shortCode = $this->createShortCode($url);
}
return $shortCode;
}
// функция проверки URL на валидность
protected function validateUrlFormat($url) {
return filter_var($url, FILTER_VALIDATE_URL,FILTER_FLAG_HOST_REQUIRED);
}
// проверяем URL на существование в Интернете
protected function verifyUrlExists($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_NOBODY, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
$response = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return (!empty($response) && $response != 404);
}
// вытаскиваем URL из таблицы
protected function urlExistsInDb($url) {
$query = "SELECT short_code FROM " . self::$table .
" WHERE long_url = :long_url LIMIT 1";
$stmt = $this->pdo->prepare($query);
$params = array(
"long_url" => $url
);
$stmt->execute($params);
$result = $stmt->fetch();
return (empty($result)) ? false : $result["short_code"];
}
// метод создает ShortCode
protected function createShortCode($url) {
$id = $this->insertUrlInDb($url);
$shortCode = $this->convertIntToShortCode($id);
$this->insertShortCodeInDb($id, $shortCode);
return $shortCode;
}
// вставка в базу
protected function insertUrlInDb($url) {
$query = "INSERT INTO " . self::$table .
" (long_url, date_created) " .
" VALUES (:long_url, :timestamp)";
$stmnt = $this->pdo->prepare($query);
$params = array(
"long_url" => $url,
"timestamp" => $this->timestamp
);
$stmnt->execute($params);
return $this->pdo->lastInsertId();
}
//
protected function convertIntToShortCode($id) {
$id = intval($id);
if ($id < 1) {
throw new Exception(
"ID не является числом!!!");
}
$length = strlen(self::$chars);
if ($length < 10) {
throw new Exception("Длина последовательности слишком мала!");
}
$code = "";
while ($id > $length - 1) {
$code = self::$chars[fmod($id, $length)] . $code;
$id = floor($id / $length);
}
$code = self::$chars[$id] . $code;
return $code;
}
protected function insertShortCodeInDb($id, $code) {
if ($id == null || $code == null) {
throw new Exception("Input parameter(s) invalid.");
}
$query = "UPDATE " . self::$table .
" SET short_code = :short_code WHERE id = :id";
$stmnt = $this->pdo->prepare($query);
$params = array(
"short_code" => $code,
"id" => $id
);
$stmnt->execute($params);
if ($stmnt->rowCount() < 1) {
throw new Exception(
"Строка не была обновлена!!!");
}
return true;
}
}
-
- Михаил Русаков
Комментарии (1):
$code = self::$chars[ $id ] . $code можно заменить на $code = self::$chars[ $id - 1 ] . $code, чтобы первая короткая ссылка была /1/, а не /2/
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.