- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
В 2023 году Google заблокировал более 170 млн фальшивых отзывов на Картах
Это на 45% больше, чем в 2022 году
Оксана Мамчуева
Переиграть и победить: как анализировать конкурентов для продвижения сайта
С помощью Ahrefs
Александр Шестаков
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Уважаемые друзья и товарищи! Хотелось бы получить вашу помощь и совет.
Мне нужно реализовать счетчик человек, которые закачали файл...
Сейчас у меня при закачке файла работает такая система - Нажав на название файла, человек попадает на страницу, где срабатывает счетчик ( $downloaded++; ) и записывается в БД. Через секунду методом <META refresh> в который подставляется нужный УРЛ файла пользователю отдается этот файл...
Это не есть удобно для пользователя, да и что-то внутри мне подсказывает, что я слишком все усложнил... Хочу давать прямые ссылки на файлы прямо из каталога (хрен с ними, с личерами - от этого, в конце-концов, только мои пользователи страдают).
Может есть способ сделать счетчик по модели, чтобы скрипт распознавал нажатие ссылки на файл или факт начала самой закачки?
Буду очень благодарен!
Может есть способ сделать счетчик по модели, чтобы скрипт распознавал нажатие ссылки на файл или факт начала самой закачки?
- можно обрабаывать нажатие на ссылку javascript`ом - при этом отпадает статистика прямых ссылок и выключенный JS
- можно парсить лог апача - самый 100% правильный и надежный результат - но статистика не риалтайм
- можно отдавать файл из php - если файлы большие ненадежно
- можно из php делать редирект - отпадают прямые ссылки (но можно помухлевать с .htaccess и настроить нужный refferer - но обойти можно)
Я у себя делаю (упрощенно) следующим образом:
ссылка действительно ведет на отдельный скрипт, в который передается какой-либо параметр, позволяющий определить что за файл нужно отдать на закачку. В моем случае это id записи в БД, в которой лежит имя файла. После того, как скрипт находит имя, делаем следующее:
После всего этого пользователю будет выдано окно для сохранения файла.
$file - полный путь к файлу на сервере.
$fname - имя, под которым сохранится файл у пользователя (может отличатся от реального имени файла)
Ну и соответственно в базе увеличиваете счетчик.
--
Действительно, если файл имеет большой размер, надо идти другим путем.
Пример хтаццесс:
Пример кода (get.php) с поддержкой докачки:
Вырезал лишние строки, поэтому прийдётся самостоятельно подправить ;)
Dkameleon спасибо большое! Если б еще с комментариями - вообще б цены не было... :))) А зачем докачка? Если у меня бесплатное скачивание, то она же не нужна? Какой там кусок кода можно убрать тогда?
А зачем докачка?
Докачка нужна, когда клиент пользователя пытается продолжить закачку после разрыва соединения и запрашивает часть файла, в указанном диапазоне.
Или при многопоточной закачке качалкой.
Поэтому ничего убирать не советую.
Вот тут проверяется, запросил ли пользователь файл с самого начала и целиком, или только определённый диапазон:
if (!isset($_SERVER["HTTP_RANGE"])) {Dkameleon, вот только сел попытался разобраться с этим скриптом... Не, дофига всего непонятного... Например:
$fn = @basename($_SERVER["REQUEST_URI"]);
Это мы берем какой-то идентификатор, взяв за основу ... имя файла?
# processing database counter
$db_connection = db_connect_local(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE);
с этим, вроде понятно. Но функция, ваша, по-видимому. У меня она называется db_connect(); но это - несущественно.
$download = db_get_download($fn);
А вот этой функции-то у меня нету... Эта функция, скорее всего, извлекает из базы ЧТО-ТО, используя идентификатор полученный на шаге 1 в качестве опознавательного знака... ЧТО она оттуда извлекает, чтобы записать в переменную download?
if (count($download) == 0) {
$download = db_get_latest_download();
}
если эта переменная, в которую мы извлекли непонятно ЧТО равняется нулю... Не, ее еще посчитать надо? Что делает функция count? А db_get_latest_download???
Я тут просто рыдаю - ни фига не понимаю. Точнее, одно понял точно - докачка мне просто необходима! А если с самого начала скрипта не понимаю ничего, то дальше идти - не может быть и речи... HELP! Пожалуйста...
Это мы берем какой-то идентификатор, взяв за основу ... имя файла?
Да. Через модреврайт.
При запросе, к примеру:
http://site.com/downloads/file.zip
$_SERVER["REQUEST_URI"] будет содержать /downloads/file.zip
Эта функция, скорее всего, извлекает из базы ЧТО-ТО, используя идентификатор полученный на шаге 1 в качестве опознавательного знака... ЧТО она оттуда извлекает, чтобы записать в переменную download?
По имени файла вытаскиваем из базы запись, соответствующую этому файлу, если такая есть.
Что делает функция count?
Проверяет успешность извлечения данных из базы :)
Первую запись, соответствующую запрошенному имени, если такая в базе имеется.
А db_get_latest_download???
Контроль версий. Если пользователь пытается запросить что-то левое, то ему возвращается самый последний файл. У вас все строки касательно БД можно скорей всего просто выкинуть.
У вас все строки касательно БД можно скорей всего просто выкинуть.
Спасибо... То есть, первое выкинуть? Оно не имеет отношения к докачке? Значит, нужно оставить только этот кусок?
Даже так: Вряд ли вам понадобится массив, как у меня:
Дефайните директорию с файлами.
Из запроса по реврайту получаете запрашиваемое имя файла.
Получаете его размер. Если файла не оказывается - редирект в корень и забыли.
В остальных случаях - выдаём файл сначала или с запрошенной части.