web-dev-qa-db-fra.com

Pourquoi les données de mise en cache MySQL sont-elles sur notre site dynamique PHP Site?

Nous avons une gêne avec notre site PHP/MySQL en ce qu'il semble cacher des données de la base de données et de nos PHP Pages affichent des enregistrements hors date. En fait, il existe des pages qui lien vers URL qui ont été complètement supprimés de la base de données, mais ils ne montrent pas des enregistrements mis à jour ni même des données manquantes.

Si nous avons la patience d'attendre plusieurs heures (non définies), les données seront éventuellement présentées. J'ai ajouté les en-têtes NO-Cache réguliers via PHP sur toutes les pages, mais cela ne semble pas affecter la sortie MySQL.

Le PHP Portion du site est instantanément mis à jour cependant, et montre immédiatement HTML, etc. Existe-t-il un moyen de forcer mysql à dessiner des données fraîches de ses requêtes? Je pensais que c'était le chemin travaillé de toute façon!

Merci, chris

P.s. Voici les codes PHP que j'utilise pour essayer de forcer une situation de cache:

header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Date in the past
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); // Always modified
header("Cache-Control: private, no-store, no-cache, must-revalidate"); // HTTP/1.1 
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache"); // HTTP/1.0
5
user1867

Vous pourriez faire sélectionnez sql_no_cache . Ceci est utilisé par MySqldump pour toujours vider de nouvelles données à un fichier texte. Cela peut également aider à affleurer la piscine tampon InnoDb si la table sélectionnée est INNODB.

Si vous ne pouvez pas manier les instructions SELECT, puis définissez Query_Cache_Type sur . Cela fera que toutes les sélectionneurs se comportent comme Select sql_no_cache. Vous pouvez le faire sans redémarrer MySQL:

Étape 1) Ajouter ceci au /etc/my.cnf

[mysqld]
query_cache_type=0

Étape 2) Exécutez cela dans le client MySQL

SET GLOBAL query_cache_type = 0;

Dernier mot

Cela peut augmenter la lecture d'E/S. Vous pouvez également envisager de définir INNODB_MAX_DIRTY_PAGES_PCT = 0 à Keey the InnoDB Buffer piscine avec les données les plus fraîches qui sont aussi complètement rinçues sur le disque.

Étape 1) Ajouter ceci au /etc/my.cnf

[mysqld]
query_cache_type=0
innodb_max_dirty_pages_pct=0

Étape 2) Exécutez cela dans le client MySQL

SET GLOBAL query_cache_type = 0;
SET GLOBAL innodb_max_dirty_pages_pct = 0;

Mise à jour 2011-05-20 11:17

Il est possible que toutes les connexions DB ont expiré du point de vue de PHP.

Voyez si le redémarrage de MySQL et Apache le feront.

En outre, assurez-vous que les valeurs de délai d'attente pour MySQL, PHP et Apache correspondent à tous

Aussi, fais cela

netstat | grep [m3][y3][s0][q6] | grep TIME_WAIT

Cela aide à voir si des connexions DB Dead DB n'ont pas été publiées par le système d'exploitation

2
RolandoMySQLDBA

Rien que MySQL ne mènera pas à des données stables - pas le cache de requête, pas SQL_Cache, pas le key_buffer, pas le buffer_pool. Le problème doit être en dehors de MySQL.

7
Rick James

Vous utilisez probablement l'un de ces génériques =PHP: http://fr.wikipedia.org/wiki/list_of_php_acéléérateurs

Je trouve l'APC et EaceCelerator le plus utilisé dans la nature.

Il y a d'autres PHP = également disponibles avec chaque cadre ou une application étant utilisée, par exemple Wordpress à l'aide de WP-cache ou W3 Total Cache, des modèles Smarty à l'aide de Smarty Cache , etc..

Vous dites "notre site", donc je suppose que vous sauriez si vous utilisez des caches dB comme SQL-relais ou MySQL-proxy-cache, ou des caches frontales telles que les proxies inverse, le calmar et le vernis, ou des variantes mises en cache .

Déboguer votre PHP Pages Web en dehors de/Sans le serveur Web pour aider à déterminer l'endroit où la mise en cache a lieu.

2
joe

IMHO, cela ressemble à votre application utilise MemCache ou cache basé sur disque Dossier. Par exemple, =Wordpress a des plug-ins cache pouvant utiliser un dossier A / cache /. Si vous avez un tel dossier, essayez de supprimer tous les fichiers qui ont l'air comme des hachages, tels que:

9a72de66e3c2f853d08352d8e78e7628
7e688f6a4cb633965d9883bb35cb8575
799f242667b315796ffe8f8d4bb4a3e2
f9e46e6486ca03ec62abc67d011f2a89
1
randomx

Il s'agit du code le plus simple pour sélectionner et afficher des enregistrements à partir de la table de base de données MySQL et d'afficher PHP.

$cn=mysql_connect($db_Host,$db_user,$db_password) or die(mysql_error());
mysql_select_db($db_name,$cn) or die(mysql_error());

$sql = “SELECT field_name FROM table_name”;
$rs = mysql_query($sql) or die(mysql_error());

while($row = mysql_fetch_array($rs)){

echo $field_name = $row["field_name"];
echo “</br>”;

}
mysql_free_result($rs);

Source: http://phphelp.co/2012/04/26/how-to-Select-and-Display-mysql-records-data-in-php

0
aneeq