Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为php mysql查询创建缓存_Php_Mysql_Caching - Fatal编程技术网

为php mysql查询创建缓存

为php mysql查询创建缓存,php,mysql,caching,Php,Mysql,Caching,我正在运行一个php脚本,它从MySQL表中提取数据。我将在一个经常访问的服务器上运行它,并希望将数据在缓存中保留X个时间。因此,一旦拉取它,数据就会保存在服务器上,而时间还没有过去。以下是脚本: <?php include('mysql_connection.php'); $c = mysqlConnect(); $locale = $_GET['locale']; $last_news_id = $_GET['news_id']; sendQuery ("set characte

我正在运行一个php脚本,它从MySQL表中提取数据。我将在一个经常访问的服务器上运行它,并希望将数据在缓存中保留X个时间。因此,一旦拉取它,数据就会保存在服务器上,而时间还没有过去。以下是脚本:

<?php
include('mysql_connection.php');

$c = mysqlConnect();

$locale = $_GET['locale'];
$last_news_id = $_GET['news_id'];

sendQuery ("set character_set_results='utf8'"); 
sendQuery ("set collation_connection='utf8_general_ci'"); 

if(strcmp($locale,"ru") != 0)
    $locale = "en";
$result = sendQuery("SELECT * FROM news WHERE id > ".$last_news_id." and locale = '".$locale."' ORDER BY id DESC LIMIT 10");
echo '<table width=\"100%\">';
while($row = mysqli_fetch_array($result, MYSQL_NUM))
{
    echo '<tr><td width=\"100%\"><b>Date: </b>'.$row[2].'</td></tr>';
    echo '<tr><td width=\"100%\">'.preg_replace('/#([^#]*)#(.*)/', ' <a href="$2" target="_blank">$1</a>', $row[3]).'</td></tr>';
    echo '<tr><td width=\"100%\"><hr style="height: 2px; border: none; background: #515151;"></td></tr>';
}
echo '</table>';

mysqliClose($c);
您可以使用php Memcache:
只需将此代码添加到脚本中的“sendQuery()”函数之后,并将其存储在缓存中,如下所示:

$memcache_obj = memcache_connect('memcache_host', 11211);
memcache_set($memcache_obj, 'var_key', $result, 0, 30);
echo memcache_get($memcache_obj, 'var_key');

这两种解决方案是APC和Memcache。前者也是一个opcache,后者可以是分布式的。选择最适合您的内容。

事实上,您的数据已经保存在服务器上。
这样的查询应该非常快


因此,这里似乎不需要缓存。尤其是当您遇到空载问题但只是以防万一时。

Apc/Memcached可以使用,并且通常用于这类事情。但是,您必须了解这种方法可能会产生的问题:管理新的插入/更新等等。只要您并不真正关心这些信息,您就可以设置数据过期的任意时间间隔,但是如果这些信息确实与您的应用程序相关,那么这种方法将不起作用


此外,mysql已经缓存了在两个请求之间未修改的选择,因此基本上,如果您现在执行一个选择,10分钟内执行一个完全相同的查询,如果表中没有任何更改,您将从mysql的查询缓存中获得结果。发出数据请求和接收数据仍然存在开销,但速度非常快。默认情况下,这种方法适用于更新/删除问题,因为每当表中的记录被修改时,关联的查询缓存都会被擦除,因此,您将获得所有的修改。

您可以使用APC为什么不使用双引号?因此,从技术上讲,我编写的这个脚本不应该在服务器上增加太多负载,即使我每天访问1000次?对于每天访问1000次,肯定不会。这是一种导致任何潜在问题的方法。这些问题通常出现在高并发性和高流量的情况下。缓存系统的理念不是缓存所有内容。这是为了发现缓存可以改进的地方,同时考虑其缺点(因为存在上述缺点)。