在ASPNET中,我逐渐喜欢Application和Cache商店。他们太棒了。对于没有经验的人,你可以把数据逻辑对象扔进去,嘿嘿,你只需要查询一次数据库中的一些数据。

迄今为止最好的ASPNET功能之一,IMO。

我已经放弃了Windows for Linux,因此放弃了用于webdev的PHP,Python和Ruby。我最常使用PHP是因为我开发了几个开源项目,都使用PHP。

毋庸置疑,我已经探讨了PHP在缓存数据对象方面提供的功能。到目前为止,我玩过:

  1. 序列化为文件(一个非常慢/昂贵的过程)
  2. 将数据写入文件为JSON / XML / plaintext / etc(对于读取操作来说甚至更慢)
  3. 将数据作为纯PHP写入文件(读取速度最快,但编写操作非常复杂)
  4. 我现在应该强调,我正在寻找一种不依赖第三方应用程序(例如memcached)的解决方案,因为应用程序安装在各种场景中,其中大多数都没有安装权限(例如:廉价的共享主机帐户)。

    回到我现在正在做的事情,持续保存文件安全? 生产服务器安全性中的规则1 一直是禁用文件写入,但我真的如果无法写入,PHP 可以缓存的任何方式都看不到。是否有任何提示和/或技巧来提高安全性?

    我还记得另一种持久存档的方法吗?

    在“有限”中有更好的缓存方法吗?环境吗

有帮助吗?

解决方案

序列化非常安全且常用。然而,有另一种选择,那就是缓存到内存。查看 memcached APC ,他们既自由又高效。关于PHP中不同缓存技术的本文也可能是有意义的。

其他提示

Re:我还记得另一种持久存档的方法吗?

它的实用性有限,但如果您有一个特别强大的数据库查询,则可以将序列化对象写回索引数据库表。你仍然有数据库查询的开销,但它是一个简单的选择,而不是强大的查询。

Re:坚持保密吗?和便宜的共享主机帐户)

可悲的事实是廉价的共享托管并不安全。您信任100,500或1000名其他有权访问您服务器的人?出于历史和(讽刺)安全原因,共享托管环境将PHP / Apache作为非特权用户运行(PHP作为Apache模块运行)。这里的安全理性是,如果面向apache进程的世界遭到破坏,那么剥削者只能访问无法使用的非特权帐户,而这些帐户无法使用重要的系统文件。

糟糕的是,这意味着无论何时使用PHP写入文件,该文件的所有者都是同一个无特权的Apache用户。对于系统中的每个用户都是如此,这意味着任何人都可以对文件进行读写访问。上述场景中的理论黑客也可以访问这些文件。

PHP中还存在一种持久的不良做法,即向目录和文件提供777的目录权限,以使非特权的apache用户能够将文件写出,然后将目录或文件保留在该状态。这使得任何人对系统进行读/写访问。

最后,您可能会认为默默无闻可以拯救您。 “他们无法知道我的秘密缓存文件在哪里”,但你错了。共享主机在同一组中设置用户,大多数默认文件掩码将为您的组用户提供对您创建的文件的读取权限。有时SSH进入您的共享主机帐户,向上导航目录,您通常可以开始浏览系统上的其他用户文件。这可以用来嗅出可写文件。

解决方案并不漂亮。一些主机将提供CGI Wrapper,允许您将PHP作为CGI运行。这里的好处是PHP将作为脚本的所有者运行,这意味着它将作为您而不是非特权用户运行。避免了问题!新问题!传统的CGI在2月就像糖蜜一样缓慢。

有FastCGI,但FastCGI很挑剔,需要不断调整。没有多少共享主机提供它。如果你找到一个,它们可能会启用APC,甚至可以为memcached提供一种机制。

我遇到了类似的问题,因此编写了一个解决方案,一个用PHP编写的内存缓存。它只需要PHP构建来支持套接字。除此之外,它是一个纯PHP解决方案,应该在共享主机上运行良好。

http://code.google.com/p/php-object-高速缓存/

如果我必须能够写作,我总是这样做是为了确保我没有在任何地方写作我有PHP代码。通常我的目录结构看起来像这样(它在项目之间变化,但这是一般的想法):

project/
  app/
  html/
    index.php
    data/
  cache/

app 不可由Web服务器写入(最好也不是index.php)。 cache 是可写的,用于缓存诸如解析模板和对象之类的东西。根据需要, data 可能是可写的。也就是说,如果用户上传数据,则会进入数据。

Web服务器指向 project / html ,并且方便的方法用于设置 index.php 作为为项目中的每个页面运行的脚本。您可以在Apache中使用mod_rewrite,或者在内容协商(我的偏好但通常不可能),或者您喜欢的任何其他方法。

所有真实代码都存在于 app 中,Web服务器无法直接访问它,但应将其添加到PHP路径中。

这对我来说非常适合几个项目。例如,我甚至可以使维基媒体使用这种结构的修改版本。

哦......我会使用serialize()/ unserialize()来进行缓存,尽管生成PHP代码具有一定的吸引力。我所知道的所有模板引擎都会生成PHP代码来执行,从而使解析后的速度非常快。

如果您可以访问数据库查询缓存(即MySQL),则可以将对象序列化并将其存储在数据库中。数据库将负责将查询结果保存在内存中,因此应该非常快。

你没有拼出 - 为什么你试图缓存对象。您是否正在尝试加快数据库查询速度,解决昂贵的对象实例化问题,避免重复生成复杂页面,维护应用程序状态,或者您是否只是在长时间冬季强制性地存储对象?

考虑到大多数低成本共享托管的恶劣限制,最佳解决方案将取决于您要完成的任务。争取桶底共享主机意味着你必须接受你将不会使用最好的工具。这些数字难以量化,但在托管成本,网站性能和网站性能之间存在折衷。开发者时间(即 - 快速,便宜或简单)。

理论上可以在会话中存储对象。这可能会让你通过文件写入禁用问题。此外,您可以将会话存储在支持mysql内存的表中,以加快查询速度。

某些托管位置可能编译了APC ..这将允许您将对象存储在内存中。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top