Мой вариант, - зациклить php скрипт, который инкриминирует счетчик из базы, потом ждет случайное количество секунд, и так по кругу. А чтобы скрипт при остановке запускался снова, другая функция запускается по крону, раз в 20 мин. Она проверяет, накручивается ли счетчик, если он завис, запускает заново функцию накрутки. Вот основной код:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Counter extends CI_Controller
{
function __construct()// в конструкторе просто снимаем ограничение на выполнение скрипта
{
set_time_limit(0);
}
var $max_time = 30;//Максимальное время паузы
/*Сначала функция проверяет включена ли автонакрутка в настройках(чтобы можно было остановить скрипт).Фунция берет значение счетчика из Mysql, прибавляет к нему единицу. Затем генирируется случайное число от 0 до 30 (количество секунд). Вызывается функция sleep() c этим случайным количеством секунд, после паузы скрипт перекидывает на начало.*/
private function counter()
{
$this->db->where('field', 'on_counter');
$query = $this->db->get('settings');
$result = $query->row_array();
$trigger = $result['value'];// проверяем, включена ли автонакрутка, если нет - стоп скрипт
if ($trigger == TRUE)
{
$query = $this->db->get('counters');
$result = $query->result_array();//берем счетчик из базы
$increment = $result[0]['counter'] + 1;//инкреминируем счетчик
$data['bad_counter'] = $increment;
$this->db->where('id', 1);
$this->db->update('counters', $data);//Обновляем счетчик в базе
$random_time = mt_rand(0, $this->max_time);//генирируем случайное число от 0 до 30
sleep($random_time);//Пауза скрипта на это случайное время
$this->index();
//перикидываем на сачало этого скрипта
}
else
{
echo 'Накрутка отключена';//если в настройках выключена автонакрутка срабатывае это условие
}
}
/* эта функция служит для того чтобы перезапускать функцию counter(), втом случае если она остановится(рестарт сервера, или какие нибудь глюки). Она запускается по CRON раз в 10 мин. Она берет значение счетчика из базы в переменную $qcounter1, ждет 60(на всякий случай удваеваем максимальное время) секунд, еще раз берет значение счетчика из базы в переменную $counter2. Затем переменниы $counter1 и переменная $counter2 сравниваются. Если они равны, значит накрутка зависла и мы запускаем функцию counter() вновь.*/
function off_on()
{
$query = $this->db->get('counters');
$result = $query->result_array();
$counter1 = $result[0]['counter'];//взяли значение счетчика из базы в первую переменную
sleep($bad_max_time * 2);//ждем удвоеное максимальное время
$query = $this->db->get('counters');
$result = $query->result_array();
$counter2 = $result[0]['bad_counter'];//взяли значение счетчика из базы во вторую переменную
if ($counter1 == $counter2)
{
$this->couner();//счетчики равны, значит накрутка не пашет, запускаем накрутку
}
else
{
die();//счетчики не равны, значит накрутка идет, в этом случае просто стоп скрипт
}
}
}
/*end of file*/
Пожалуйста, если вы знаете более элегантные решения, помогите хотя бы намеком.
Заранее спасибо.
Спустя 3 часа, 31 минута, 3 секунды (28.02.2011 - 18:58) inpost написал(а):
Mikagami
крон и раз в минуту запускать плюс =)
крон и раз в минуту запускать плюс =)
Спустя 16 минут, 47 секунд (28.02.2011 - 19:14) Mikagami написал(а):
Цитата (inpost @ 28.02.2011 - 15:58) |
Mikagami крон и раз в минуту запускать плюс =) |
Спасибо за ответ. Проблема в том, что счетчик должен выглядеть абсолютно реалистично. Я для простоты описал только основной принцип, но в классе еще есть функции, корректирующие скорость инкремента в зависимости от времени суток. В 2 ночи Коэффициент равен 0.2, это в 5 раз медленнее, чем при пиковой посещаемости в 21.00. При запуске по крону раз в минуту такою функциональность реализовать не получится.
А также возникает вопрос, что если инкремент нужно делать чаще, чем раз в минуту?
Спустя 1 час, 12 минут, 20 секунд (28.02.2011 - 20:27) DmitryOpalev написал(а):
Ну так разве нельзя проверять время и следя из этого...?
Спустя 1 минута, 2 секунды (28.02.2011 - 20:28) Snus написал(а):
Mikagami
Зачем тебе фальшивый счетчик?
Зачем тебе фальшивый счетчик?

Спустя 25 минут, 56 секунд (28.02.2011 - 20:54) inpost написал(а):
Mikagami
Тогда запускай раз в минуту, но вероятность того, что будет +1 будет 10%, вечером: +30%
Snus
Сеошники дурят заказчиков =)
Тогда запускай раз в минуту, но вероятность того, что будет +1 будет 10%, вечером: +30%
Snus
Сеошники дурят заказчиков =)
Спустя 3 минуты, 35 секунд (28.02.2011 - 20:57) Snus написал(а):
inpost
В таком не буду помогать.
В таком не буду помогать.
Спустя 2 месяца, 4 дня, 20 часов, 22 минуты, 17 секунд (3.05.2011 - 16:19) Anabioz999 написал(а):