Есть список прокси
CREATE TABLE IF NOT EXISTS `sa_proxy` (
`id_proxy` int(11) NOT NULL AUTO_INCREMENT,
`ip_address` varchar(45) DEFAULT NULL,
`date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`last_use` timestamp NULL DEFAULT NULL,
`proxy_status` varchar(45) DEFAULT NULL,
`proxy_type` set('http','socks') DEFAULT NULL,
`port` mediumint(9) DEFAULT NULL,
`login` varchar(45) DEFAULT NULL,
`password` varchar(45) DEFAULT NULL,
`id_proxy_group_fk` int(11) NOT NULL,
PRIMARY KEY (`id_proxy`),
KEY `fk_sa_proxy_sa_proxy_group1` (`id_proxy_group_fk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1005 ;
Эти прокси используются, каждое использование заносится в таблицу
CREATE TABLE IF NOT EXISTS `sa_proxy_used` (
`id_proxy` int(11) NOT NULL,
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
`action` varchar(64) NOT NULL,
KEY `id_proxy` (`id_proxy`,`date`,`action`),
KEY `id_proxy_2` (`id_proxy`),
KEY `action` (`action`),
KEY `date` (`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Иногда прокси бывают заблокированны сервисом и заносятся во временный блок
CREATE TABLE IF NOT EXISTS `sa_proxy_block` (
`idsa_proxy_block` int(11) NOT NULL AUTO_INCREMENT,
`action` varchar(45) DEFAULT NULL,
`date` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
`date_block_off` timestamp NULL DEFAULT NULL,
`id_proxy_fk` int(11) NOT NULL,
PRIMARY KEY (`idsa_proxy_block`),
KEY `fk_sa_proxy_block_sa_proxy1` (`id_proxy_fk`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Сведения о блокировках прокси' AUTO_INCREMENT=2 ;
Как можно сделать ограничения:
использовать прокси не чаще чем раз в Х секунд (с момента прошлого запуска)
использовать прокси не чаще чем X раз в течении Y секунд (например не более 100использований за 180 секунд)
не использовать заблокированные прокси
для прокси есть распаралеливание под разные действия action, например загружать информацию с сайта 1 или сайта 2. Если для сайта 1 уже есть ограничение Xзапусков в Y секунд то для сайта 2 ограничение не действует
может быть заблокированно прокси, когда оно считается нерабочим.
Пример запроса который получился у нас. работает не совсем правильно.
Для решения задачи вы можете изменить структуру базы если так будет лучше.
$count_use = 20000; // Ограничение на использование прокси за периоды было 50
$period = 60*45; // Период в течении которого считать прокси использованным
$delay = 1; // Задержка в использовании прокси для данного действия. (использовать прокси не чаще чем раз в 8 секунд)
$this->db->select('sa_proxy.*, count(sa_proxy_used.id_proxy) as count, max(sa_proxy_used.date) as last_use');
$this->db->from('sa_proxy');
$this->db->join('sa_proxy_block', ' sa_proxy_block.id_proxy_fk = sa_proxy.id_proxy and `sa_proxy_block`.`date_block_off` > ''.date('Y-m-d H:i:s').'' and sa_proxy_block.action = ''.mysql_real_escape_string($action).''', 'left', false);
$this->db->join('sa_proxy_used', 'sa_proxy_used.id_proxy = sa_proxy.id_proxy', 'left', false);
$this->db->where('sa_proxy_block.id_proxy_fk',NULL);
$this->db->where(' ( sa_proxy_used.date > "'.date( 'Y-m-d H:i:s', time()-intval($period)).'" OR sa_proxy_used.date IS NULL )',NULL,FALSE ); // Обрезаем по дате использования прокси (что бы использовать не более N раз за период )
$this->db->group_by('sa_proxy.id_proxy'); // Группируем что бы посчитать колличество использований прокси
$this->db->order_by('count', 'desc'); // Берем те которые уже использовали, если они не заблокированны
$this->db->having('count <', $count_use);
$this->db->having(' ( last_use <>query = $this->db->get();
$this->proxy_active = $this->query->result_array();
Хочется найти человека на долгое сотрудничество, который будет в курсе базы. Оплата соответствует вашим знаниям и результатам.
Разделы:
Опубликован:
19.11.2013 | 10:26 [последние изменения: 19.11.2013 | 14:56]