【问题标题】:Caching, CDN - are they the same for PHP Yii site? How to use it for a dynamic php site?缓存、CDN - 它们对于 PHP Yii 站点是否相同?如何将它用于动态 php 站点?
【发布时间】:2012-03-21 05:46:34
【问题描述】:

我有一个动态 php(基于 Yii 框架)站点。用户必须登录才能在网站上执行任何操作。我正在尝试了解缓存和 CDN 的工作原理;我有点困惑。

缓存(memcache)

我的网站有大量的 css、js 和图像。我已经了解到启用缓存(“memcache”?)将大大加快我的网站速度。但这让我很困惑。缓存有什么帮助?我的意思是,如何分别为每个用户缓存从数据库中出来的东西?例如,用户 1 登录,他会看到他的控制面板。用户 2 登录,用户 2 将看到他们的控制面板。

如何确定要缓存的内容?另外,如何启用缓存(memcaching)?

CDN:

有人告诉我使用像 CloudFlare 这样的内容交付网络。假设会自动缓存我的网站。那么,当我的 user-1 登录时,它会缓存什么?它会只缓存主页 CSS、JS 和主页图片吗?因为其他一切都需要登录?用户注销时会发生什么?我的意思是,“会话”会干扰 CDN 的工作吗?

通过 CDN 提供图像是否会显着减少服务器上的负载?我没有太多现金来获得集群服务器配置。所以,我只希望我的(共享)服务器能够将其所有资源用于处理 PHP 代码。那么,使用“缓存”(类似于 memcache)和/或“CDN”(类似于 CloudFlare)可以节省多少负载?

终于

在这种情况下实施缓存、cdn 和基本性能优化的一般策略是什么?我是否需要对我的 php 代码进行任何更改以启用像 CloudFlare 这样的 CDN 并启用/实施/配置缓存?我该怎么做才能花费最少的开发人员/编码时间,并使我的网站运行得更快?

哦,等等,我的一些页面,如“关于我们”页面等,也将是静态 html。但他们不会获得那么多的点击率。除了可能用于我的 Facebook 页面的 iFrame 页面。

【问题讨论】:

    标签: php memcached yii cdn cloudflare


    【解决方案1】:

    我实际上为 CloudFlare 工作,并认为我会参与解决一些问题。

    "我是否需要对我的 php 代码进行任何更改以启用 CDN,例如 CloudFlare 并启用/实施/配置缓存?我能做些什么 这将花费最少的开发人员/编码时间,并使我的 网站运行速度快得多?”

    不,不需要重写网址等。我们会自动通过文件扩展名cache static content。但是,这确实需要更改您的 DNS 以指向我们。

    通过 CDN 提供图像是否会显着减少服务器上的负载?

    是的,它还应该可以帮助大多数访问者更快地访问该网站并为您节省大量带宽。

    “哦,等等,我的一些页面,比如“关于我们”页面等。 静态 html 也是。”

    CloudFlare 默认不缓存 HTML。您可以使用 PageRules 为静态 HTML 等设置更高级的缓存选项。

    【讨论】:

      【解决方案2】:

      缓存有帮助,因为不是为每个用户执行磁盘 io,而是将数据存储在内存中,即 memcached。这显着提高了性能。

      Memcache 一般用于缓存数据,即查询结果。 http://pureform.wordpress.com/2008/05/21/using-memcache-with-mysql-and-php/ 教程很多。​​

      我只使用过 amazon s3,它不是一个 CDN。它更像是一个存储平台,但在提供媒体服务时仍然有助于减轻我自己的服务器的负载。

      我会将您所有的静态资源放在 CDN 上,这样您自己的服务器就不必为这些资源提供服务。它不需要对您的 php 代码进行任何修改。这包括 JS 和 CSS。 对于您的静态页面(您的关于页面),我会确保 php 没有处理它,因为没有理由这样做。您的网络服务器应该直接为它提供服务。

      缓存需要更改您的代码。对于缓存正常流是: 1) 用户提出请求 2)检查数据是否在缓存中 3)如果它不在缓存中,请执行数据库查询并将其放入缓存中 4)如果它在缓存中检索它 5) 返回数据。

      您可以缓存任何需要磁盘 io 的内容,您应该会看到速度有所提升。

      【讨论】:

      • 谢谢,dm03514 和@Brian。我现在了解缓存的工作原理。但这又提出了另一个问题:每个用户都是不同的,拥有不同的帐户。所以,如果我要缓存查询,那么这些查询只对那个特定的用户有用!因此,如果我有 50,000 个用户,那么我需要为这 50,000 个用户中的每一个缓存查询。另外,如果结果集更新了怎么办?缓存将显示过时的结果集。
      • 抱歉耽搁了,我一直在移动大声笑,这取决于您使用的缓存系统。在大多数情况下,您希望缓存特定于用户且不易频繁更改的数据(即:电子邮件地址、姓名、偏好等帐户数据)或不易频繁更改的全局数据(页面内容、用户厘米等)。如果您决定缓存易于频繁更改的数据,您将无法对缓存数据使用简单的 TTL(生存时间)到期日期,而是需要在数据更改时手动使该数据到期。
      【解决方案3】:

      Memcached 的工作原理是将数据库信息(通常来自远程服务器甚至同一服务器上的数据库引擎)以平面文件格式存储在 Web 服务器的文件系统中。直接访问平面文件以检索以规范格式存储的数据比每次从远程查询访问该数据要快得多。当您拥有可以安全存储一段时间的数据时,这通常很有用,因为它不会定期更改。

      这种方式的工作方式是,如果您想将用户的帐户信息存储在缓存中以加快加载该用户登录的页面。您将加载信息并将其缓存在本地。在对该数据的任何后续请求中,它将在通常从数据库本身加载该信息所需的时间的一小部分内加载。显然,如果用户在登录时更改信息,您将需要确保更新/重新缓存该信息,但是如果您实施一个可以最大限度地减少等待时间的缓存系统,您将大大减少提供页面所需的时间数据库。

      我个人对 CloudFlare 并不熟悉,因此我无法就此提供任何建议,但就在您的应用程序中实现缓存而言,您应该查看:

      http://code.google.com/p/memcached/wiki/NewOverview

      并阅读其中涵盖安装/实施/等的其余 Wiki 条目。这应该会让你走上正确的道路。

      【讨论】:

        猜你喜欢
        • 2014-07-27
        • 1970-01-01
        • 1970-01-01
        • 2012-04-24
        • 2021-08-22
        • 1970-01-01
        • 2010-09-08
        • 1970-01-01
        • 2012-02-04
        相关资源
        最近更新 更多