[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Отключение кэширование определенных запросов
mrdds
Всем привет.
Вопрос такой: Как при запросах INSERT, UPDATE etc. отключить кэширование данных?
Много перекопал информации, нашел как отключить все кэширование (но мне это не нужно) и то, что можно отключить кэширование запроса SELECT через SQL_NO_CACHE, но это не работает для запросов типа UPDATE.

Используется: PHP 5.3.1 + MySQL
MyISAM, cp1251_general_ci

Буду очень признателен, если кто подскажет.



Спустя 2 дня, 3 часа, 32 минуты, 58 секунд (16.01.2011 - 23:15) mrdds написал(а):
Вопрос превращается в другой:
Как отключить кэширование PHP при многократных обновлениях страницы, где переменные определяются через rand()?

Проблема в том, что значения этих переменных кэшируются, и они перестают быть случайными.

Спустя 54 минуты, 25 секунд (17.01.2011 - 00:09) Snus написал(а):
mrdds
Код в студию.

Спустя 10 часов, 18 минут, 6 секунд (17.01.2011 - 10:27) linker написал(а):
mrdds
Первый раз слышу, чтобы MySQL кэшировал UPDATE, INSERT.

Спустя 11 часов, 24 минуты, 46 секунд (17.01.2011 - 21:52) mrdds написал(а):
Цитата
mrdds
Первый раз слышу, чтобы MySQL кэшировал UPDATE, INSERT.

linker, дык в том-то и дело, что нет. У меня после вставки ~900 строки в таблицу появлялось большое количество одинаковых строк, и я в начале считал, что это из-за кэша запросов sql. Но теперь считаю, что дело, скорее всего, в кэше иного рода. Например, пхпшном.

Итак, у меня есть localhost (используется денвер последней версии без каких-либо модификаций), на котором запускается PHP-скрипт, очень упрощенно он выглядит так:


<?
//подключение к db

$a=round(rand(0,1000));
$b=round(rand(0,1000));
$c=round(rand(0,1000));

$query=" INSERT INTO generated (`a`, `b`, `c`) VALUES ('$a','$b','$c')";
$sql=mysql_query($query) or die(mysql_error());

?>


Но это очень упрощенно, так код длинный.
Не нашел тут как приаттачить файл, так что сейчас выложу код в полном виде.

Спустя 2 минуты, 44 секунды (17.01.2011 - 21:55) mrdds написал(а):
Итак, вот код основного скрипта generator.php



<html>

<
head>
<
meta http-equiv="Expires" content="Mon, 26 Jul 2012 05:00:00 GMT" />
<
meta http-equiv="Pragma" content="no-cache" />
</
head>

<
body onload="timedMsg()">
<?php

$dblocation="localhost";
$dbname="football";
$dbuser="root";
$dbpasswd="";
$dbcnx=@mysql_connect($dblocation,$dbuser,$dbpasswd);
if (!$dbcnx)
{
echo "Не удалось подключиться к базе данных";
exit();
}
if (!@mysql_select_db($dbname,$dbcnx))
{
echo "База данных не выбрана <br>" ;
exit();
}

echo rand(0,1000000).'<br><br><br>';

ob_end_flush();

$gi=0;
while ($gi<1000) {

$i=0;
while ($i<42) {
//$par[$i]="";
unset($par[$i]);
$i++;
}

$names1=array(1,'Fernando',2,'Diego',3,'Luis',4,'Maxi',5,'Luca',6,'Felipe',7,'Antonio',8,'Luis',9,'Jose',10,'Carles',11,'Santiago',12,'Mateo',13,'Leonardo',14,'Andres',15,'Alexander',16,'Alejandro',17,'Massimo',18,'Victor',19,'Sergio',20,'Luigi',21,'Vittorio',22,'Marcos',23,'Josef',24,'Armand',25,'Cristian',26,'Emanuel',27,'Giovanni',28,'Mendes',29,'Marco',30,'Ganso',31,'Angelo',32,'Enzo',33,'Ettore',34,'Ermano',35,'Marcelo',36,'Orlando',37,'Raul',38,'Rinaldo',39,'Umberto',40,'Vittore',41,'Pino',42,'Santo',43,'Esteban',44,'Hernando',45,'Gomez');
$surnames1=array(1,'Amos',2,'Arves',3,'Maxis',4,'Naldes',5,'Nesta',6,'Zanetti',7,'Lopes',8,'Ernibeu',9,'Santana',10,'Teyuol',11,'Maldes',12,'Antonini',13,'Biscotti',14,'Leos',15,'Morrente',16,'Silvio',17,'Da Silva',18,'De Zioni',19,'Sederos',20,'Maki',21,'Morandes',22,'Fekkeu',23,'Cavanni',24,'Lisao',25,'Zigmendi',26,'Mendi',27,'Welles',28,'Trapatoni',29,'Seso',30,'Bocolli',31,'Falanda',32,'Canta',33,'Bueno',34,'Busto',35,'Martin',36,'Pinto',37,'Vega',38,'Menor',39,'Matias',40,'Delgado',41,'Ruiz',42,'Rojo',43,'Floris',44,'Gil',45,'Garrido',46,'Barcina',47,'Benito',48,'Berga',49,'Manriquez',50,'Manrique',51,'Enrique',52,'Ortiz',53,'Prieto',54,'Dominguez',55,'Escobar',56,'Alberta',57,'Agostina',58,'Baldo',59,'Bartolo',60,'Beniamino',61,'Rossi',62,'De Livo',63,'De Mena',64,'Di Santi',65,'Di Moya',66,'Magonni',67,'Markensieri',68,'Amato',69,'Arpino',70,'Da Corte',71,'Da Via',72,'De Silvestro',73,'Domino',74,'Epifano',75,'Esposito',76,'Ferra',77,'Fiorillo',78,'Gatto',79,'Guliani',80,'Ignazio');

$names2=array(1,'Alex',2,'John',3,'Mike',4,'Michael',5,'Rob',6,'Peter',7,'Victor',8,'Bruce',9,'Joe',10,'Jerom',11,'Carl',12,'Steve',13,'Paul',14,'Wayne',15,'Bred',16,'Adam',17,'Scot',18,'Shaun',19,'Travis',20,'George',21,'Alexander',22,'Ben',23,'Derrek',24,'Frank',25,'Mark',26,'James',27,'Jesper',28,'Russel',29,'Kevin',30,'Anthony',31,'Daniel',32,'Edward',33,'Robert',34,'Philip',35,'Stuart',36,'Craig',37,'Timothy',38,'Barry',39,'Douglas',40,'Garry',41,'Colin',42,'Simon',43,'David',44,'Matthew',45,'Christopher',46,'Ian',47,'Jamie',48,'Adrian',49,'Justin',50,'Alan',51,'Dean');
$surnames2=array(1,'Adamson',2,'Allford',3,'Arnold',4,'Austin',5,'Becker',6,'Deker',7,'Benson',8,'Smith',9,'Black',10,'White',11,'Luis',12,'Marshall',13,'Wright',14,'Parker',15,'Mitchell',16,'Denilson',17,'Bright',18,'Charlson',19,'Cook',20,'Maki',21,'Gilbert',22,'Gill',23,'Fulton',24,'Gibbs',25,'Harrsion',26,'Ford',27,'Young',28,'Taylor',29,'Stanley',30,'Richards',31,'Peterson',32,'Palmer',33,'Page',34,'Owen',35,'Nathan',36,'Hill',37,'Milton',38,'Mason',39,'Kirk',40,'Kelly',41,'Holmes',42,'Howard',43,'Neal',44,'Nelson',45,'Ellington',46,'Samuel',47,'Samuels',48,'Simpson',49,'Marlow',50,'Dawson',51,'Hennesey',52,'Batler',53,'Larson',54,'Lambert',55,'Kitson',56,'Bale',57,'Morrison',58,'Coleman',59,'Dunkan',60,'Cramer',61,'Quincy',62,'Ralph',63,'Oliver',64,'Newman',65,'McCaunley',66,'McDavids',67,'McAdams',68,'McMason',69,'McMarshall',70,'Connor',71,'Kennedy',72,'Johnson',73,'Garrison',74,'Faber',75,'Oakman',76,'Otis',77,'Porter',78,'Ramsey',79,'Beck',80,'Walkman');

if (round(rand(0,2))==1) {$names=$names1; $surnames=$surnames1;} else {$names=$names2; $surnames=$surnames2;}


$i=0;
while ($i==0) {
$ind1=0;
$ind1=rand(0,count($names) - 1);
$par[1]=$names[$ind1];

if (strlen($par[1])>2) {$i=1;
//echo $par[1];
//echo strlen($par[1]);

}}

$i=0;
while ($i==0) {
$ind1=0;
$ind1=rand(0,count($surnames) - 1);
$par[2]=$surnames[$ind1];

if (strlen($par[2])>2) {$i=1;
//echo ' '.$par[2];
//echo strlen($par[2]);

}}


$par[21]=round(100-rand(0,200));
$par[22]=round(rand(17,34));
if (rand(1,4)==1) {$par[23]=round(rand(164,198));}
if (rand(1,3)==3) {$par[23]=round(rand(169,191));}
if (!$par[23]) {$par[23]=round(rand(171,186));}




$i=3;
while ($i<21) {
$par[$i]=round(rand(1,10));

if ($par[22]>15 AND $par[22]<24) {
if (round(rand(1,2))==2) {} else {$par[$i]=round(rand(1,7));}}
if ($par[22]>15 AND $par[22]<20) {
if (round(rand(1,2))==2) {} else {$par[$i]=round(rand(1,5));}}

if ($par[$i]==10) {if (round(rand(1,5))==1) {} else {$par[$i]=9;}}
if ($par[$i]==9) {if (round(rand(1,3))==1) {} else {$par[$i]=8;}}
if ($par[$i]==8) {if (round(rand(1,2))==1) {} else {$par[$i]=7;}}
$i++;
}



$par[0]=1;






include('skillcounter.php');



$par[24]=$s_ability[$i];
$par[25]=$mv;
$par[26]=$basep;

$i=27;
while ($i<37) {
$ie=$i-27;
echo $a_ability[$ie];
$par[$i]=$a_ability[$ie]; //вплоть до 36
$i++;}



$i=37;
while ($i<43) {
$par[$i]=0;
$i++;}

$eing="'".$par[1]."'";

$i=2;
while ($i<=42) {
$eing=$eing.", '".$par[$i]."'";
$i++;
}
//echo $eing;



$query=" SELECT SQL_NO_CACHE * FROM generated WHERE s_tacticalbalance='$par[21]' AND height='$par[23]' AND overall='$par[24]' LIMIT 1";
$result=mysql_query($query) or die(mysql_error());
$rows_amount=mysql_num_rows($result);


if ($rows_amount==0) {



$query=" INSERT INTO generated (`name`, `surname`, `t_finishing`, `t_midshooting`, `t_1touch`, `t_shortp`, `t_longp`, `t_header`, `t_dribbling`, `p_speed`, `p_agility`, `p_stamina`, `p_strength`, `p_jump`, `m_composure`, `m_consistency`, `m_positioning`, `m_vision`, `m_teamwork`, `m_reaction`, `s_tacticalbalance`, `age`, `height`, `overall`, `mv`, `base_position`, `p1`, `p2`, `p3`, `p4`, `p5`, `p6`, `p7`, `p8`, `p9`, `p10`, `p12`, `p13`, `p14`, `p15`, `p16`, `team_id`) VALUES (".$eing.")";
$sql=mysql_query($query) or die(mysql_error());}

$query="RESET SLAVE";
$result=mysql_query($query) or die(mysql_error());

$query="RESET QUERY CACHE";
$result=mysql_query($query) or die(mysql_error());



echo '<br>Name: '.$par[1].' '.$par[2].' ('.$s_ability[$i].')';
echo '<br>Age: '.$par[22];
echo '<br>Height: '.$par[23];
echo '<br>STR_Classic: '.$str_classic; //STR_CF 1
echo '<br>STR_Tough: '.$str_toughshooter; //STR_T 2
echo '<br>STR_Runner: '.$str_offrunner; //STR_R 3
echo '<br>STR_Dribbler: '.$str_dribbler; //STR_D 4
echo '<br>MID_Attacking: '.$mid_att; //MID_AT 5
echo '<br>MID_Playmaker: '.$mid_play; //MID_PLAY 6
echo '<br>MID_Winger: '.$mid_winger; //MID_WING 7
echo '<br>MID_Defensive: '.$mid_defensive; //MID_DEF 8
echo '<br>DEF_Central: '.$def_central; //DEF_CD 9
echo '<br>DEF_Wingback: '.$def_wingback; //DEF_WB 10

$gi++;
}
?>


<script type="text/javascript">
function timedMsg()
{
var t=setTimeout("window.location.reload()",10000);
}
</script>

</
body>
</
html>


Спустя 1 минута, 13 секунд (17.01.2011 - 21:56) mrdds написал(а):
И код подключаемого скрипта skillcounter.php



<?

$i=1; while ($i<21) {
$adding=$adding+$par[$i];
$i++; }

//echo $adding.'<br>';

$adding=round($adding/20);


$str_classic=round(($par[17]*$par[3]*10+$par[19]*$par[12]*$par[5])/20)+round($par[21]/10)+$adding;

$str_toughshooter=round(($par[13]*$par[3]*10+$par[15]*$par[16]*$par[8])/20)+round($par[21]/10)+$adding;
$str_offrunner=round(($par[20]*$par[10]*10+$par[15]*$par[17]*$par[3])/20)+round($par[21]/10)+$adding;
$str_dribbler=round((10*$par[11]*$par[9]+$par[20]*$par[3]*$par[10])/20)+round($par[21]/8)+$adding;

$mid_att=round(($par[17]*$par[6]*$par[12]+10*$par[16]*$par[4])/20)+round((100-abs($par[21]))/8)+round($par[21]/16)+$adding;
$mid_play=round(($par[6]*$par[18]*10+$par[19]*$par[11]*$par[7])/20)+round((100-abs($par[21]))/6)+$adding;
$mid_winger=round(($par[7]*$par[9]*10+$par[20]*$par[10]*$par[18])/20)+round((100-abs($par[21]))/6)+round($par[21]/8)+$adding;
$mid_defensive=round(($par[13]*$par[14]*10+$par[18]*$par[16]*$par[6])/20)-round($par[21]/6)+$adding;

$def_central=round(($par[16]*$par[13]*10+$par[17]*$par[14]*$par[8])/20)-round($par[21]/10)+$adding;
$def_wingback=round(($par[10]*$par[7]*10+$par[20]*$par[9]*$par[12])/20)-round($par[21]/5)+$adding;

$a_ability=array($str_classic,$str_toughshooter,$str_offrunner,$str_dribbler,$mid_att,$mid_play,$mid_winger,$mid_defensive,$def_central,$def_wingback);
$s_ability[$i]=max($a_ability);

if ($str_classic==$s_ability[$i]) {$basep=1;}
if ($str_toughshooter==$s_ability[$i]) {$basep=2;}
if ($str_offrunner==$s_ability[$i]) {$basep=3;}
if ($str_dribbler==$s_ability[$i]) {$basep=4;}
if ($mid_att==$s_ability[$i]) {$basep=5;}
if ($mid_play==$s_ability[$i]) {$basep=6;}
if ($mid_winger==$s_ability[$i]) {$basep=7;}
if ($mid_defensive==$s_ability[$i]) {$basep=8;}
if ($def_central==$s_ability[$i]) {$basep=9;}
if ($def_wingback==$s_ability[$i]) {$basep=10;}

$mv="";


$ev=1; //extra value
if ($par[22]<=18) {$ev=3;}
if ($par[22]>18 AND $par[22]<=20) {$ev=2;}
if ($par[22]>20 AND $par[22]<=22) {$ev=1.5;}
if ($par[22]>22 AND $par[22]<=24) {$ev=1.25;}
if ($par[22]>24 AND $par[22]<=26) {$ev=1.15;}
if ($par[22]>26 AND $par[22]<=28) {$ev=1;}
if ($par[22]>28 AND $par[22]<=30) {$ev=0.9;}
if ($par[22]>30 AND $par[22]<=32) {$ev=0.8;}
if ($par[22]>32) {$ev=0.7;}

$mv=$s_ability[$i]/1000;

if ($s_ability[$i]>35) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/8);}
if ($s_ability[$i]>45) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/6);}
if ($s_ability[$i]>55) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/4);}
if ($s_ability[$i]>65) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/2.5);}
if ($s_ability[$i]>75) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/1.75);}
if ($s_ability[$i]>85) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/1.5);}
if ($s_ability[$i]>90) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/1.3);}
if ($s_ability[$i]>95) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/0.9);}
if ($s_ability[$i]>105) {$mv=round(($s_ability[$i]*(100+$par[21]/33)/140)/0.8);}

$mv=$mv*$ev;

?>


Спустя 47 минут, 6 секунд (17.01.2011 - 22:43) linker написал(а):
При
Цитата
У меня после вставки ~900 строки в таблицу появлялось большое количество одинаковых строк
и
rand(0,1000)
по теории вероятности вполне возможны повторы, на то он и рандом.

Спустя 22 часа, 6 минут, 52 секунды (18.01.2011 - 20:50) mrdds написал(а):
Да, эти повторы вполне вероятны. Но используются три параметра, а не один rand(0,1000).

$query=" SELECT SQL_NO_CACHE * FROM generated WHERE s_tacticalbalance='$par[21]' AND height='$par[23]' AND overall='$par[24]' LIMIT 1";

параметр s_tacticalbalance - 201 возможное значение (от -100 до 100)
параметр height - 35 возможных значений (от 164 до 198)
параметр overall - 100 возможных значений (от 1 до 100)

То есть количество возможных комбинаций это как минимум
201*35*100 = 703 500 вариантов
А это сильно больше 1000.
Единственный вывод, который я могу сделать - это то, что примерно 900 первых вариантов кэшируются, и в дальнейшем начинают повторятся, т.к. берутся уже из кэша, а не генерируются случайно.

Как этой канители избежать, непонятно, особенно, если не использовать всяких сторонних расширений-модулей-библиотек.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.