Просмотр полной версии : Отсроченный рандомайзер
serg-php
03.08.2008, 17:16
Имеется скрипт:
<?
/* Замените нижеследующие переменные на свои */
$host = "1"; // MySQL server
$user_db = "1"; // MySQL пользователь
$pass_db = "1"; // MySQL пароль
$dbase = "1"; // MySQL база данных
$dtable = "link"; // Таблица в базе данных
/* Соединение с сервером базы данных */
mysql_connect ($host, $user_db, $pass_db);
/* Выбор базы данных */
mysql_select_db($dbase);
/* Создание SQL запроса */
$sql = "SELECT id_link, name FROM $dtable ORDER BY RAND() LIMIT 7";
/* Исполнение SQL запроса */
$result = mysql_query($sql);
/* Проверка количества вернувшихся строчек в результате*/
$rows = mysql_num_rows($result);
/* Если нет результата или результат меньше 1, то предупредить нас об этом или вывести результат*/
if ((!$rows) || ($rows < 1)) {echo "Результатов НЕТ!!!";}
else {
echo "<br><a href='page-o$id_link.html'>$name</a><br>";
while(list($id_link, $name ) = mysql_fetch_row($result)) {
echo "";
if(empty($button))
echo "<br><a href='page-o$id_link.html'>$name</a><br>";
}
}
echo "";
?>
Как сделать, чтобы рандомайзер не сразу срабатывал, а через 5 - 10 часов?
Либо выводил последние 10 записи?
Уточни, не понятно что надо сделать.
serg-php
03.08.2008, 17:39
Чтобы условие рандома выполнялось через нное кол-во времени!
serg-php
03.08.2008, 17:54
На крон, думаю, нерационально!
serg-php
03.08.2008, 19:06
Благодарь всех, кто помог разобраться!
Огромная благодарноть blaga!
serg-php
15.08.2008, 12:17
Все-таки решил сделать рандомайзер отсроченым!
Создать таблицу, а потом обращаться и смотреть дату, далее рандомить (люди подсказали сделать так)!
serg-php
15.08.2008, 12:18
Таблицу создал
CREATE TABLE eu_random_delayed (
id smallint(5) unsigned NOT NULL auto_increment,
ldate datetime NOT NULL,
PRIMARY KEY (id)
);
serg-php
15.08.2008, 12:20
Что дальше делать?
По-логике дописывать файл, содержание которого приведено выше!
Что дописывать, не знаю!
serg-php
15.08.2008, 12:59
<?
/* Замените нижеследующие переменные на свои */
$host = "localhost"; // MySQL server
$user_db = ""; // MySQL пользователь
$pass_db = ""; // MySQL пароль
$dbase = ""; // MySQL база данных
$dtable = "eu_ad"; // Таблица в базе данных
/* Соединение с сервером базы данных */
mysql_connect ($host, $user_db, $pass_db);
/* Выбор [HTML]базы данных */
mysql_select_db($dbase);
/* Создание SQL запроса */
$sql = "SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd FROM $dtable WHERE ((catid=403)OR(catid=404)) GROUP BY link_id ORDER BY rnd LIMIT 5";
/* Исполнение SQL запроса */
$result = mysql_query($sql);
/* Проверка количества вернувшихся строчек в результате*/
$rows = mysql_num_rows($result);
/* Если нет результата или результат меньше 1, то предупредить нас об этом или вывести результат*/
if ((!$rows) || ($rows < 1)) {echo "Результатов НЕТ!!!";}
else {
echo "<table width=500 class=last_pellets>";
while(list($id_link, $images, $v_title, $v_255_12, $v_descr ) = mysql_fetch_row($result)) {
$images = explode( "\n", $images );
$images = $images[0];
$v_descr=strip_tags($v_descr);
$v_descr=substr($v_descr,0,150);
echo "<tr><td>";
if(empty($images))
echo "";
else
echo "<a href='page-o$id_link.html'><img src='files/$images' width=60 class=imgConf></a>";
echo "</td><td><a href='page-o$id_link.html'>$v_title</a> $v_descr ... </td><td>$v_255_12</td></tr>";
}
}
echo "</table>";
?>
geezer.code
15.08.2008, 13:09
интегрировать в твой код некогда .. но примерно вот такой выбор по дате последнего обновления рандома
<?
//вот эту таблу ты создал. в ней будем хранить дату последнего рандома.
/*CREATE TABLE eu_random_delayed (
id smallint(5) unsigned NOT NULL auto_increment,
ldate datetime NOT NULL,
PRIMARY KEY (id)
);*/
$sql = "SELECT ldate FROM eu_random_delayed where ldate > (now() - INTERVAL 1 DAY)";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
if ((!$rows) || ($rows < 1)) { //тут идет код с рандомом
//и проапдейтим последнюю дату рандома
$sql = "insert into eu_random_delayed(ldate) values(now())";
mysql_query($sql);
}
else {
//тут идет код без рандома
}
?>
п.с. я не пхп-программер.. если наду будет на руби )) то будет полный код
serg-php
15.08.2008, 13:20
Вариант понятен, но не понятно его внедрение.
Если оказывается, что один день не прошел, то какие данные должен вывести скрипт?
Очевидно точь-в-точь с предыдущим рандомом. Тогда, как он знает, какие строки он выбирал в преды дущем рандоме?
geezer.code
15.08.2008, 13:57
Вариант понятен, но не понятно его внедрение.
Если оказывается, что один день не прошел, то какие данные должен вывести скрипт?
Очевидно точь-в-точь с предыдущим рандомом. Тогда, как он знает, какие строки он выбирал в преды дущем рандоме?
если так то нужно создать еще одну промежуточную таблицу. в которую выводить результаты последнего рандома.
serg-php
15.08.2008, 14:16
Тогда ситуация в корне меняется!
У меня вывод рандома по 5 нужным мне категориям!
Рандом и скрипта, который инклудится убираем.
А ситуация такая:
Каждые сутки или иной интервал, скриптец запусакется и рандобно выбирает данные из указанных категорий!
serg-php
15.08.2008, 14:48
Подсказали такой вариант:
Главная таблица eu_add
1. Создать таблицу eu_add_random , в которой будет ифа, к ней, собственно, скрипт из инклуда будет обращаться, а не к eu_add;
(Это не проблема - знаю как сделать)
2. Скрипт, который будет пополнять таблицу eu_add_random из таблицы eu_add раз в сутки?
Как он будет запускаться? (Можно ли не кроном? Или крон опитимальный варант?)
geezer.code
15.08.2008, 14:51
Подсказали такой вариант:
Главная таблица eu_add
1. Создать таблицу eu_add_random , в которой будет ифа, к ней, собственно, скрипт из инклуда будет обращаться, а не к eu_add;
(Это не проблема - знаю как сделать)
2. Скрипт, который будет пополнять таблицу eu_add_random из таблицы eu_add раз в сутки?
Как он будет запускаться? (Можно ли не кроном? Или крон опитимальный варант?)
можно не кроном... для этого при каждом запросе к скрипту будет выполняться минимум 1 лишний запрос к базе. поэтому лучше кроном.
serg-php
15.08.2008, 15:34
Тогда я делаю так:
1. Делаю дубликат таблицы eu_add и называю ее eu_add_random
2. Создаю пхп-файл, который собственно крон и должен запускать.
3. В файле пишу, копировать из eu_add в eu_add_random из таких категорий, случайним образом.
И все!
serg-php
15.08.2008, 16:15
<?
/* Замените нижеследующие переменные на свои */
$host = "localhost"; // MySQL server
$user_db = ""; // MySQL пользователь
$pass_db = ""; // MySQL пароль
$dbase = ""; // MySQL база данных
$dtable = "eu_ad"; // Таблица в базе данных
$dtable_rnd = "eu_add_random"; // Таблица в базе данных
/* Соединение с сервером базы данных */
mysql_connect ($host, $user_db, $pass_db);
/* Выбор базы данных */
mysql_select_db($dbase);
/* Создание SQL запроса */
$sql = "SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd FROM $dtable WHERE ((catid=471)OR(catid=473) OR(catid=474) OR(catid=475)OR(catid=476)) GROUP BY link_id ORDER BY rnd LIMIT 5";
$sql = "INSERT link_id, images, v_title, v_255_12, v_descr, catid INTO $dtable_rnd";
?>
geezer.code
15.08.2008, 16:18
SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd INTO $dtable_rnd FROM $dtable WHERE ((catid=471)OR(catid=473) OR(catid=474) OR(catid=475)OR(catid=476)) GROUP BY link_id ORDER BY rnd LIMIT 5";
А не проще ли вместо извращений с БД выводить результат запроса в файл и его просто инклудить? Преимущества на лицо - в десятки раз уменьшаем количество запросов к базе (так как надо раз обновлять файл раз в час/сутки), не надо создавать лишних, да и ненужных таблиц
Получится что-то вроде:
$filetime=lstat('news.txt'); // Получаем массив информации о файле
$cur=time()-$ftime[9]; // Получаем время прошедшее с последней модификации файла
if ($cur>2500) // Если прошло больше 2500 секунд, то делаем запрос к БД
{
$f=fopen('news.txt','w');
// Все echo заменяем на $out.=
// Чтобы собрать в эту переменную все данные которые надо выводить
$host = "localhost"; // MySQL server
$user_db = ""; // MySQL пользователь
$pass_db = ""; // MySQL пароль
$dbase = ""; // MySQL база данных
$dtable = "eu_ad"; // Таблица в базе данных
mysql_connect ($host, $user_db, $pass_db);
mysql_select_db($dbase);
$sql = "SELECT link_id, images, v_title, v_255_12, v_descr, catid, rand() AS rnd FROM $dtable WHERE ((catid=403)OR(catid=404)) GROUP BY link_id ORDER BY rnd LIMIT 5";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);
$out="";
if ((!$rows) || ($rows < 1)) {$out.="Результатов НЕТ!!!";}
else {
$out.="<table width=500 class=last_pellets>";
while(list($id_link, $images, $v_title, $v_255_12, $v_descr ) = mysql_fetch_row($result)) {
$images = explode( "\n", $images );
$images = $images[0];
$v_descr=strip_tags($v_descr);
$v_descr=substr($v_descr,0,150);
$out.= "<tr><td>";
if(empty($images))
echo "";
else
$out.= "<a href='page-o$id_link.html'><img src='files/$images' width=60 class=imgConf></a>";
$out.="</td><td><a href='page-o$id_link.html'>$v_title</a> $v_descr ... </td><td>$v_255_12</td></tr>";
}
}
$out.="</table>";
fwrite($f,$out);fclose($f); // Записываем в файл
}
echo file_get_contents('news.txt'); // Всегда выводим содержимое файла
serg-php
15.08.2008, 17:37
Вот люди предлагают такой вариант:
<?php
/* SQL query
CREATE TABLE IF NOT EXISTS `eu_random_delayed` (
`id` tinyint(1) unsigned NOT NULL,
`time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
`link_ids` tinytext,
PRIMARY KEY (`id`)
);
INSERT INTO `eu_random_delayed` (`id`, `time`, `link_ids`) VALUES (1, NULL, NULL);
*/
function EchoTable($sql) {
$aLink_id = array();
/* Исполнение SQL запроса */
$result = mysql_query($sql['select']);
/* Проверка количества вернувшихся строчек в результате*/
$rows = mysql_num_rows($result);
/* Если нет результата или результат меньше 1, то предупредить нас об этом или вывести результат*/
if ((!$rows) || ($rows < 1)) {
echo "Результатов НЕТ!!!";
} else {
echo "<table width=500 class=last_pellets>";
while(list($id_link, $images, $v_title, $v_255_12, $v_descr ) = mysql_fetch_row($result)) {
$aLink_id[] = $id_link;
$images = explode( "\n", $images );
$images = $images[0];
$v_descr=strip_tags($v_descr);
$v_descr=substr($v_descr,0,150);
echo "<tr><td>";
if (empty($images))
echo "";
else
echo "<a href='page-o$id_link.html'><img src='files/$images' width=60 class=imgConf></a>";
echo "</td><td><a href='page-o$id_link.html'>$v_title</a> $v_descr ... </td><td>$v_255_12</td></tr>";
}
}
echo "</table>";
return $aLink_id;
}
/* Замените нижеследующие переменные на свои */
$host = "localhost"; // MySQL server
$user_db = ""; // MySQL пользователь
$pass_db = ""; // MySQL пароль
$dbase = ""; // MySQL база данных
$dtable = "eu_ad"; // Таблица в базе данных
/* Соединение с сервером базы данных */
mysql_connect ($host, $user_db, $pass_db);
/* Выбор [HTML]базы данных */
mysql_select_db($dbase);
$sql['link_ids'] = 'SELECT `link_ids`
FROM `eu_random_delayed`
WHERE `id` = 1
AND `time` > (NOW() - INTERVAL 1 DAY)
AND `link_ids` IS NOT NULL';
$result = mysql_query($sql['link_ids']);
if (mysql_num_rows($result) > 0) {
$link_ids = mysql_result($result, 0);
$sql['select'] = 'SELECT `link_id`, `images`, `v_title`, `v_255_12`, `v_descr`, `catid`
FROM ' . $dtable . '
WHERE `link_id` IN(' . $link_ids . ')';
EchoTable($sql);
} else {
$sql['select'] = 'SELECT `link_id`, `images`, `v_title`, `v_255_12`, `v_descr`, `catid`, RAND() AS `rnd`
FROM ' . $dtable . '
WHERE ((`catid` = 403) OR (`catid` = 404))
GROUP BY `link_id`
ORDER BY `rnd`
LIMIT 5';
$aLink_id = EchoTable($sql);
if (count($aLink_id) > 0) {
$sql['insert'] = 'UPDATE `eu_random_delayed` SET
`link_ids` = "' . implode(',', $aLink_id) . '"
WHERE `id` = 1';
mysql_query($sql['insert']);
}
}
?>
Что скажете?
Посмотри выше, то же самое только не нужно десяток двадцатиэтажных мускульных запросов и скрипт практически умещается на коленке
serg-php
15.08.2008, 18:10
Gifts,
это тоже вариант!
Касательно нагрузки на систему может быть удачный!
Где файл news.txt хранить?
В корневой или глубже?
serg-php
15.08.2008, 18:12
У меня вывод по 5 разделам! Это что 5 инклудов делать?
Значит 5 файлов news.txt (news1.txt,news2.?
serg-php
15.08.2008, 18:20
Gifts, в товоем предложении что-то нето! - При каждом запросе разные данные выводятся, а они должны выводиться только через 24 часа!
Если у тебя есть скрипт, который при каждом открытии страницы выводит что-то там по 5 категориям, то вставляешь его между строчками
$f=fopen('news.txt','w');
и
fwrite($f,$out);fclose($f);
Тогда в течение 2500 у тебя будет появляться одна и та же страница с тем выводом, который ты хочешь. Файл news.txt может находиться где угодно, главное чтобы он был открыт для записи (права 777 на всякий случай) и чтобы в скрипте все ссылки были исправлены на новое местоположение этого файла
Строчка $cur=time()-$ftime[9];Должно быть $cur=time()-$filetime[9];
serg-php
15.08.2008, 18:25
А я инклуд делал того файла который содержит код Gifts!
serg-php
15.08.2008, 18:27
Я бросил код Gifts в отдельный файл, который инклудил в index.php! Неправильно?
Ошибка в скрипте
Строчка $cur=time()-$ftime[9];Должно быть $cur=time()-$filetime[9];
Да, скрипт нужно инклудить
Нормально он инклудится, только на всякий случай пути до news.txt нужно указывать абсолютные в скрипте
serg-php
15.08.2008, 18:29
Как сделать, чтобы код Gifts в отдельном файле инклудить в index.php?
serg-php
15.08.2008, 18:37
Вообще в данной ситуации если инклуддить news.txt, то файл с кодом Гифтс, запускать кроном!
serg-php
15.08.2008, 18:47
Работает, Гифтс!
Я говорю по пяти разделам!
У меня согласно данному скрипту реализуется только по одному разделу!
Получается 5 инклудов!
Скрипта гифта, только с разным обращением к таблице!
serg-php
15.08.2008, 18:49
Например 1000 хостов в сутки 5 инклудов!
Будет ли это максимально оптимальным вариантом реализации моего замысла?
>.< Зачем кроном? Каждый раз пользователь заходя на страницу будет получать либо кешированную страницу, либо он своим заходом ее и обновит, лишние телодвижения совершать не надо. Задержка между обновлениями в строчке if ($cur>2500) Число 2500 - это количество СЕКУНД между обновлениями
serg-php
15.08.2008, 18:53
>.< Зачем кроном? Каждый раз пользователь заходя на страницу будет получать либо кешированную страницу, либо он своим заходом ее и обновит, лишние телодвижения совершать не надо. Задержка между обновлениями в строчке if ($cur>2500) Число 2500 - это количество СЕКУНД между обновлениями
Принято! Понятно! Согласен!
А как быть по други вопросам?
serg-php
15.08.2008, 19:00
Вообще, Гифтс!
Сейчас шлифую твой вариант! Весьма удачный, должен заметить!
serg-php
15.08.2008, 20:04
Вообщем, сделал 5 инклудов! Все выводит рандомится с интервалом 2500 секунд!
serg-php
15.08.2008, 20:10
Прошу тему пока не закрывать! Возможно, что-то работать не будет!
serg-php
16.08.2008, 22:55
Благодарю всех, кто мне помогал!
Особенно благодарю Гифта его вариант настолько дельный.
Жаль, что я раньше такого способа не знал!
Заменил 2500 на 86400 и наслаждаюсь рандомизацией 1 в сутки!
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot