PDA

Просмотр полной версии : Отсроченный рандомайзер


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 записи?

NOmeR1
03.08.2008, 17:31
Уточни, не понятно что надо сделать.

serg-php
03.08.2008, 17:39
Чтобы условие рандома выполнялось через нное кол-во времени!

blaga
03.08.2008, 17:52
поставить его на Cron

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";

Gifts
15.08.2008, 17:33
А не проще ли вместо извращений с БД выводить результат запроса в файл и его просто инклудить? Преимущества на лицо - в десятки раз уменьшаем количество запросов к базе (так как надо раз обновлять файл раз в час/сутки), не надо создавать лишних, да и ненужных таблиц

Получится что-то вроде:

$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']);
}
}

?>

Что скажете?

Gifts
15.08.2008, 17:41
Посмотри выше, то же самое только не нужно десяток двадцатиэтажных мускульных запросов и скрипт практически умещается на коленке

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 часа!

Gifts
15.08.2008, 18:21
Если у тебя есть скрипт, который при каждом открытии страницы выводит что-то там по 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! Неправильно?

Gifts
15.08.2008, 18:28
Ошибка в скрипте
Строчка $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 инклудов!

Будет ли это максимально оптимальным вариантом реализации моего замысла?

Gifts
15.08.2008, 18:50
>.< Зачем кроном? Каждый раз пользователь заходя на страницу будет получать либо кешированную страницу, либо он своим заходом ее и обновит, лишние телодвижения совершать не надо. Задержка между обновлениями в строчке 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 в сутки!