1

I'm having somewhat theoretical question: I'm designing my own CMS/app-framework (as many PHP programmers on various levels did before... and always will) to either make production-ready solution or develop various modules/plugins that I'll use later.

Anyway, I'm thinking on gathering SQL connections from whole app and then run them on one place:

index.php:
<?php
  include ('latestposts.php');
  include ('sidebar.php');
?>

latestposts.php:
<?php
  function gather_data ($arg){ $sql= ""; }
  function draw ($data) {...}
?>

sidebar.php:
<?php
  function gather_data ($arg){ $sql= ""; }
  function draw ($data) {...}
?>

Now, while whole module system application is yet-to-be-figured, it's idea is already floating somewhere in my brain. However, I'm thinking, if I'm able to first load all gather_data functions, then run sql and then run draw functions - and if I'm able to reuse results!

If, in example, $sql is SELECT * FROM POSTS LIMIT 10 and $sql2 is SELECT * FROM POSTS LIMIT 5, is it possible to program PHP to see: "ah, it's the same SQL, I'll call it just once and reuse the first 5 rows"?

Or is it possible to add this behavior to some DRM?

However, as tags say, this is still just an idea in progress. If it proves to be easy to accomplish, then I will post more question how :)

So, basically: Is it possible, does it make sense? If both are yes, then... any ideas how?

4

2 回答 2

2

不要误会我的意思,这听起来像是一个合理的想法,你可能会让它运行起来。但我想知道它是否真的会有益。它会导致系统更快吗?给你更多控制权?让开发更简单?

我只是考虑使用(或构建)一个使用实践良好的 MVC 样式编码标准的系统,构建一个良好的数据库结构,并调整 Apache 的技术(或使用类似 Lighttpd 的东西)。如果您决定将代码开源,那么您的代码将会得到更广泛的接受,并且如果您需要帮助,其他开发人员可以直接介入并拿起键盘。

此外,请查看 MySQL 中的查询缓存——您将看到与查询示例相关的缓存查询结果服务器端的类似(尽管不是一对一)好处。更好的是存储在服务器内存中,这样 PHP/MySQL 的开销就会减少,而且您不必编写代码。

除了所有这些,我确实认为这是可能的。=)

于 2010-02-02T20:43:03.070 回答
1

一般来说,这样的高速缓存系统可以节省大量时间,但代价是内存和复杂性。您想要保留的结果越多,占用的内存就越多;并且无法保证您的结果会再次被使用,尤其是较大的结果集。

其次,有些查询永远不应该被缓存,或者即使它们在缓存中也应该再次运行。在大多数情况下,只有 SELECT 和 SHOW 查询可以被有效缓存,但您需要担心在修改底层数据时它们会失效。即使在同一个页面浏览中,您有时也会发现自己在使用自己的缓存系统。

第三,这种问题已经解决了好几次了。首先,考虑开启 MySQL 查询缓存。大多数情况下,它会加快速度,而无需您更改任何代码。但是,使条目无效有点激进,因此您可以在更高级别获得一些性能。

如果您需要另一个级别,请考虑memcached。您必须手动存储条目并使条目无效,但它可以跨页面视图存储结果(您将真正发现性能优势),并且会让未使用的条目在内存不足之前过期。

于 2010-02-02T21:04:24.537 回答