将PHP对象缓存到文件的方法?

2022-08-30 16:44:41

在 ASPNET 中,我渐渐爱上了应用程序和缓存存储。他们真棒。对于初学者,你可以把你的数据逻辑对象扔进去,嘿,你只需要查询数据库一次以获取一点数据。

到目前为止,最好的ASPNET功能之一,IMO。

从那以后,我放弃了Windows for Linux,因此PHP,Python和Ruby用于webdev。我最常使用PHP,因为我开发了几个开源项目,所有项目都使用PHP。

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

  1. 序列化为文件(一个非常缓慢/昂贵的过程)
  2. 将数据作为JSON / XML / plaintext / etc写入文件(对于读取操作甚至更慢)
  3. 将数据作为纯PHP写入文件(最快的读取,但相当复杂的写入操作)

我现在应该强调,我正在寻找一种不依赖于第三方应用程序(例如memcached)的解决方案,因为这些应用程序安装在各种场景中,其中大多数都没有安装权限(例如:廉价的共享主机帐户)。

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

有没有另一种我忘记的持久化到文件的方法?

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


答案 1

序列化非常安全且常用。但是,还有另一种选择,那就是缓存到内存中。看看memcachedAPC,它们都是免费的,而且性能很高。这篇关于PHP中不同缓存技术的文章也可能很有趣。


答案 2

回复:我忘记了另一种持久保存到文件的方法吗?

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

回复:持久化到文件安全吗?和便宜的共享主机帐户)

可悲的事实是廉价的共享主机并不安全。您对有权访问您服务器的 100,500 人或 1000 名其他人的信任程度如何?出于历史和(具有讽刺意味的)安全原因,共享托管环境将PHP / Apache作为非特权用户运行(PHP作为Apache模块运行)。这里的安全理由是,如果面向apache进程的世界受到损害,则攻击者只能访问无法与重要系统文件拧紧的非特权帐户。

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

PHP 中还有一个持续的不良做法,即向目录和文件授予目录权限 777,以使无特权的 apache 用户能够写出文件,然后将目录或文件保留在该状态。这为系统上的任何人提供了读/写访问权限。

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

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

有FastCGI,但FastCGI很挑剔,需要不断调整。没有多少共享主机提供它。如果您找到一个这样做的机制,那么他们很可能启用了APC,甚至可能能够为memcached提供一种机制。


推荐