我有一个简单的JS脚本 - 对我的服务器的ajax请求。在此服务器上,我建立一个PDO连接,执行一个预准备语句:
SELECT * FROM table WHERE param1 = :param1 AND param2 = :param2;
其中table
是包含5-50行,5-15列的表格,平均每天更改一次数据。
然后我将json结果回显给脚本并用它做一些事情,让我说我控制台记录它。
问题是脚本每秒运行10,000次。这给了我很多与数据库的连接,并且我在服务器日志中始终出现can't connect to the database
错误。这意味着有时它可以工作,当DB进程是空闲的时候,有时候不是。
我该如何处理?
可能的解决方案:
还有什么更好的吗?
答案 0 :(得分:0)
对于如此少量更改的少量数据,我只能将其作为常规PHP文件。
以数组形式获取数据后,使用var_export()
将其转储到php文件中。然后只需包含此文件并使用简单的循环来搜索数据。
另一个选择是使用Memcached,它是在这种工作中创建的,在具有高速网络的快速机器上,memcached可以轻松处理每秒200,000多个请求,高于你的适度10k rps。
你甚至可以从中消除PHP,使得Nginx使用ngx_http_memcached_module
直接向Memcached询问存储的变量如果你想坚持使用当前基于Mysql的解决方案,你可以在mysql配置中增加max_connections
个数字,但是,如果它高于200则可能需要一些OS调整。但是你不应该做一个持久的联系,这将使事情变得更糟。
答案 1 :(得分:0)
您需要利用缓存。每次为这种缓慢变化的数据发出AJAX请求时,根本没有理由从数据库中获取数据。
您可以采取的几种方法(甚至可能相互结合使用)。
应用程序和数据库之间的缓存。这可能是memcache或类似的,并允许您执行基于散列的查找(可能基于传递的参数的一些散列)到存储在内存中的数据(可能是JSON表示或您最终返回到客户端的任何数据格式)。
客户端和应用程序之间的缓存。这可能采取Web服务器提供的缓存,基于CDN的缓存或类似的形式,这将阻止请求在缓存中给定适当存储的未过期项目时甚至到达您的应用程序。
答案 2 :(得分:0)
还有什么更好的?没有
由于您多次输出相同的结果,因此明智的解决方案是缓存结果。
我有根据的猜测是你的错误假设 - memcached不是为此而建的 - 是基于你计划单独存储每条记录
我实现了一个简单的缓存机制供您使用:
<?php
$memcached_port = YOUR_MEMCACHED_PORT;
$m = new Memcached();
$m->addServer('localhost', $memcached_port);
$key1 = $_GET['key1'];
$key2 = $_GET['key2'];
$m_key = $key1.$key2; // generate key from unique values , for large keys use MD5 to hash the unique value
$data = false;
if(!($data = $m->get($m_key))) {
// fetch $data from your database
$expire = 3600; // 1 hour, you may use a unix timestamp value if you wish to expire in a specified time of day
$m->set($m_key,$data,$expire); // push to memcache
}
echo json_encode($data);
你做的是:
决定表示结果的内容(输入参数集)
将其用于memcache密钥(例如,如果它是一个国家和语言,密钥将是$ country。$ language)
检查结果是否存在:
一个。拉动所需的数据
湾将数据放入数组
℃。将数据推送到memcached
d。输出数据
有更有效的方法来缓存数据,但这是最简单的方法,听起来就像是你的代码。
10,000次请求/秒仍然无法证明创建服务器级缓存所需的工作量(nginx / what) 在一个理想的调整世界中,一个带计算器的鸡可以运行facebook ..但是谁在乎呢? (: