我的AJAX搜索程序一直在向PHP询问特定搜索词的结果。 PHP脚本的开头通过MySQL数据库读取并初始化,因此如果PHP不断重启,则必须读取数百万次数据库。如果我可以保持它活着并让一个正在运行的PHP脚本实例提供多个愚蠢的AJAX请求,我相信性能会提高。
你通常如何做到这一点?使用服务?这可以通过服务完成吗?
答案 0 :(得分:2)
PHP没有长期对象的概念或线程或请求之间的共享状态,每个请求总是从零开始(当然除了会话状态)。您可以通过缓存到磁盘或内存来模拟长期存在的对象(请参阅memcached)。
在脚本初始化时,您是否有特殊原因要读取整个数据库?
答案 1 :(得分:1)
答案 2 :(得分:1)
如何将db结果存储在会话变量中?您首先检查关键字是否不在会话中(会话允许在页面刷新之间传输变量值),如果不允许,则执行数据库查询。
存储它:
$_SESSION['storedQueries']['keyword']= 'its definition, from the database';
寻找它:
$index= array_search('keyword',array_keys($_SESSION['storedQueries']));
$result = ($index) ? $_SESSION['storedQueries'][$index] : 'nothing found, you should do a db query';
如果您使用javascript库,例如jquery:
,则ajax部分非常简单$('#resultZone').load('find.php',{keyword: $('input.search').val() });
答案 3 :(得分:1)
如果搜索结果与多个用户类似,我通常会创建一个缓存文件并在那里序列化结果集。作为文件名,我可能会使用包含搜索查询和用户组的字符串的md5sum。然后,当Ajax需要数据时,我只需要检查文件是否太旧,如果不是,我只需将其发送到客户端,甚至可能只是将Ajax http请求重定向到文件(假设格式正确) 。如果文件太旧,我只需用新内容刷新它。
对于体积非常大的网站,memcached通常是更好的选择。还有一些php缓存帮助和SQL连接池降低了打开SQL连接的开销。
答案 4 :(得分:0)
连接到数据库是一项非常昂贵的操作,您可以通过缓存结果来解决这个问题,看看Zend_Cache并了解它如何为您节省麻烦。