Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用PHP进行缓存_Php_Caching - Fatal编程技术网

用PHP进行缓存

用PHP进行缓存,php,caching,Php,Caching,这个问题以前可能被问过,但我还不能决定我应该用什么。我正在构建一个小型API包装器,有一些方法可以使用该方法获得的数据缓存 数据是JSON格式的。因此,当我浏览时,我找到了一些存储这些数据的解决方案。其中之一是APC,它看起来非常整洁,更像是在客户端使用localStorage。但是后来我发现这不是PHP预先安装的扩展,对于PHP的最新版本,有一些bug(开发人员不认为它是稳定的)。我还很难将它添加到XAMPP中,以便在本地进行测试 所以我没有考虑它,而是考虑了其他选项,比如在服务器上创建文件。

这个问题以前可能被问过,但我还不能决定我应该用什么。我正在构建一个小型API包装器,有一些方法可以使用该方法获得的数据缓存

数据是JSON格式的。因此,当我浏览时,我找到了一些存储这些数据的解决方案。其中之一是APC,它看起来非常整洁,更像是在客户端使用localStorage。但是后来我发现这不是PHP预先安装的扩展,对于PHP的最新版本,有一些bug(开发人员不认为它是稳定的)。我还很难将它添加到XAMPP中,以便在本地进行测试

所以我没有考虑它,而是考虑了其他选项,比如在服务器上创建文件。这似乎也是个不错的主意,直到我发现当我创建文件夹时,
chmod
0755
,这不是很方便。我起初认为这是我做的,但后来我在这里读到一篇文章,说了一些关于安全模式的内容,它不允许我用
0777
模式创建文件夹。所以我在寻找一个解决方案,我发现使用FTP可以解决这个问题。我尝试了FTP,但效果很好,只是我很难实现一种方法,使连接保持打开状态,直到超时,并且每次调用连接到FTP并创建文件夹的方法时都不会覆盖连接

我听说的另一个解决方案是Memcache,如果我没有弄错的话,但这似乎是一种开销


所以我有点怀疑我应该用什么来缓存数据。如果有人有一些建议,我们将不胜感激:)

无论您做什么,都不要编写自己的缓存解决方案。那种能做到这一点的人,不需要就此提出问题

  • 安装APC。它将解决比它所造成的问题多得多的问题
  • 使用Memcache和/或Redis缓存对象—会话、分数等等
  • 使用Varnish在web服务器前面缓存HTML

我使用APC、Redis、Memcache和Varnish的组合开发了每秒超过10000个请求的应用程序。它们非常非常好。

我使用Mac进行开发,我使用类似以下内容从php创建文件夹:

$oldmask = umask(0);
chmod($structure, 0777);
umask($oldmask);
如果你在Windows上,可能是因为某些Windows设置。。。我没有太多的windows经验

如果在创建文件夹时遇到问题,也可以对MySQL进行缓存

尝试为需要缓存的结果创建md5哈希,并将其与结果和时间戳一起存储到数据库中的表cacheTbl中

存储缓存时,将需要缓存该数据的时间添加到当前时间

接下来,当您需要这些数据时,首先查看数据库中是否有用于您请求的有效缓存,如果是,则从那里获取,如果不在缓存中,则生成该数据并将其存储到下一个请求中

通过构建两个简单的函数可以轻松实现:

SetCache($hash, $content, $seconds);

GetCache($hash);
如果需要缓存方法结果,则在方法生成要缓存的数据后调用SetCache函数,并将$hash设置为类似方法名称的值

在方法的顶部,检查GetCache是否有有效的缓存,如果有,则从那里获得结果并退出thr方法,或者如果没有缓存,则执行该方法的其余部分并存储缓存以供下一个请求使用

稍后可以添加cronjob来清理所有旧缓存

如果需要内存缓存,您可以查看:

你可以试试这个,简单的 首先,从缓存中获取对象。如果它为null,则执行查询、API获取JSON、XML或任何您喜欢的内容,然后在600秒内将其设置回缓存,以服务500、1000、10000名访问者等

有了这个缓存,您不需要触摸php.ini,也不需要担心root权限,就可以像memcache或APC一样设置它

<?php
    include("php_fast_cache.php");
    // try to get from Cache first.
    $html = phpFastCache::get("keyword,page");

    if($html == null) {
        $html = Render Your Page || Widget || "Hello World";
        phpFastCache::set("keyword,page",$html,600);
    }

    echo or return your $html;
?>


你不能在你的脚本中使用chmod()到777吗?@vodich~我试过了,但它没有改变权限,我仍然无法写入或删除它:)我不会创建一个新的解决方案,因为我需要的不是那么重要,我的目标不是创建一个新的缓存解决方案。我尝试的是在没有安装扩展的情况下使用APC和回退目录。主要的问题是,这个API包装器不仅会被我使用,还会被其他可能不知道如何使用它的用户使用(他们会有一个API文档,告诉他们如何使用JS调用方法,所以不需要PHP技能),所以我正在寻找一个不需要任何额外步骤的解决方案。我缓存对象,没有涉及HTML:)@Roland你想缓存什么,为什么?HTML响应?数据库中的对象?来自另一个API的响应?@Blowski~我正在缓存从远程服务器获取的JSON对象,我不想使用任何MySQL@Roland对,在这种情况下,APC是不相关的,这实际上不是缓存问题,而是权限问题。因此,在PHP中使用
mkdir()
创建文件夹,即使它是0755,因为Web服务器是所有者,所以它们仍然可以对它进行写入。理想情况下,使用cron获取远程对象,您的主应用程序可以始终在本地查看。我不确定使用cron获取远程对象是什么意思:)