【问题标题】:Caching a variable using PHP?使用 PHP 缓存变量?
【发布时间】:2015-04-15 21:43:17
【问题描述】:

我正在检索目录中的所有文件并缓存该值,这样我就不必一次又一次地检索它

$memefiles = glob("usermemes/*.jpeg"); 
$total_pages = ceil(sizeof($memefiles)/$num_rec_per_page);

有没有办法缓存这个结果,这样我就不必一次又一次地执行这些功能。

【问题讨论】:

标签: php caching glob


【解决方案1】:

有很多方法可以优化或缓存,最好的方法取决于您要缓存的内容、数量和所需的刷新频率。例子是

  • 将计算结果存储在会话、数据库或文件中 - 然后查找它
  • 预先进行计算,然后在需要时查找它们
  • 存储您的页面(PHP 输出在文件中)并将存储的版本交付给用户
  • 使用缓存/HTTP 加速器,例如 Varnish

在这种情况下,我认为预先计算会满足您的需求。只需将您的代码放在一个脚本中,calculate.php,将计算出的$total_pages 值保存到一个文件中:

<?
$memefiles = glob("usermemes/*.jpeg"); 
$total_pages = ceil(sizeof($memefiles)/$num_rec_per_page);
file_put_contents('totalpages.dat', $total_pages);
?>

现在设置一个 cron 作业,每 1 分钟、5 分钟、每小时或您的需要运行一次 calcaulate.php。如果您在 Windows 服务器上运行,则应改用等效的任务计划程序。设置 cronjobs 非常容易,但它因系统和 GUI / 命令行工具而异,如果您有现场服务器或使用专业的虚拟主机,则会有所不同。因此,请在 stackoverflow 中搜索适合您特定情况的 cron 作业。

假设您有一个 cron 作业正在运行,将 $total_pages 的值保存到文件中,那么您将通过以下方式在网页上检索您的值

$total_pages = file_get_contents('totalpages.dat');

保证这将提高所有需要提供$total_pages 值的页面的性能。与accepted answer相比,这个解决方案有一些显着的优势:

  • 任务每次只运行一次,无论您有 1、10.000 还是 1.000.000 个用户/页面加载。
  • 用户仍然可以收到几乎新鲜或几乎实时的数据。新鲜程度由 cronjob 频率决定。

【讨论】:

  • 在这种情况下我将如何存储数组$memefiles
  • @SheelRanjan,因为 $memefiles 只是一个简单的数组,您可以使用 $content_to_file = implode(',', $memefiles); 将其作为字符串保存到文件中,然后从文件中读取内容,将其转换回数组$memefiles = explode(',', $content_from_file);
  • 内爆和爆炸后我的性能还能提升吗?
  • @SheelRanjan,捍卫!读取字符串并将其转换为数组绝对比一遍又一遍地加载目录要快得多。除此之外,file_get_contents 的输出本身会被缓存,请参阅stackoverflow.com/q/9555658/1407478,您存储值的文件的内容很可能由操作系统本身保存在内存中。所以在实践中,你最终会从内存中读取一个字符串,偶尔会被 cron 作业更新 = 一个真正的缓存。
  • 第一次运行快 2 倍,第二次运行快 200 倍!
【解决方案2】:

使用 cookie。为了将数组存储在 cookie 中,您必须将其编码为 json,然后使用 json_decode() 对其进行解码。使用下面的代码

 <?php

    if(!isset($_COOKIE['calculation'])) {
    $memefiles = glob("usermemes/*.jpeg"); 
    $total_pages = ceil(sizeof($memefiles)/$num_rec_per_page);
    setcookie('calculation', json_encode($memefiles), time() + (8640000000 * 30), "/"); // Set the cookie for unlimited time
    }
    else{
    $memefiles = json_decode($_COOKIE['calculation'],true);
    }
    ?>

希望对你有帮助

【讨论】:

  • 我还有一个疑问。如果目录有很多文件,它会提高性能吗?
  • @Sheel Ranjan 如果目录有很多文件,这将大大提高性能
  • 我认为你没有将数组存储在缓存中,我应该这样做吗setcookie('memes', $memefiles, time() + (8640000000 * 30), "/");
  • 我可以把$_COOKIE['calculation']换成$_SESSION['calculation']吗,因为文件的数量需要定期更新。
  • 我没有在代码中使用 session 的原因是在你关闭窗口后 session 将丢失,你将不得不重新计算。如果您想再次设置 cookie,只需使用 $_COOKIE['calculation'] = "your_value";
猜你喜欢
  • 1970-01-01
  • 2013-08-31
  • 2011-08-05
  • 2011-09-16
  • 2014-03-24
  • 2013-11-12
  • 2011-10-26
  • 1970-01-01
相关资源
最近更新 更多