存储简单变量(如';总行数';在Symfony2中

存储简单变量(如';总行数';在Symfony2中,symfony,Symfony,在我的symfony2应用程序中,我需要在所有页面的顶部显示一些总数,即“已注册200154555个用户” 我不想在每次页面加载时运行查询来计算出该计数。我提出的解决方案是创建一个“variable”实体,它有两列,name和value。然后,我将设置一个在cron上运行的控制台命令,该命令将使用一个统计所有人行的查询来更新这些可变实体(例如“totalPeople”),等等 这感觉有点笨手笨脚。。。有更好的解决方案吗?您可以使用条令的分页功能(如果您使用条令)。这将利用查询的“限制”部分(即使

在我的symfony2应用程序中,我需要在所有页面的顶部显示一些总数,即“已注册200154555个用户”

我不想在每次页面加载时运行查询来计算出该计数。我提出的解决方案是创建一个“variable”实体,它有两列,name和value。然后,我将设置一个在cron上运行的控制台命令,该命令将使用一个统计所有人行的查询来更新这些可变实体(例如“totalPeople”),等等


这感觉有点笨手笨脚。。。有更好的解决方案吗?

您可以使用条令的分页功能(如果您使用条令)。这将利用查询的“限制”部分(即使使用联接),并将为您提供总行数(通过计数查询)

您可以设置全局参数并添加服务来重写它们。然后从您的命令调用服务

或者直接设置一个服务来读/写一个文件(例如json数组)

或者设置一个选项表,其中有一行存储数据。这样的查询不会是一个资源密集型的查询

下面是我用来存储RSS提要的内容(在我解析它们之后)


例如,您可以在后端实现它,这样每次管理员登录时,它都会检查缓存,只有当缓存太旧时才会刷新。虽然我也很喜欢4AM cron作业解决方案。

谢谢您的回复,但我不确定这是否解决了我的问题。我对获取总行数没有问题……问题是我需要在每个页面上显示这些统计信息,而获取总行数所需的查询总共需要几秒钟的时间来执行(我已经有数百万行了)。因此,我需要以某种方式缓存该值,我不确定这样做的最佳方法是什么。谢谢,这些听起来都是不错的选择。选项1听起来很不错,您是否可以使用fread fwrite来更新parameters.yml文件中变量的值?这似乎有点粗略。选项3听起来与我最初的想法很接近,但我的理解是,我应该专注于Doctrine的ORM,应该只将对象保存到DB,而不仅仅是设置选项表。但它确实听起来很简单,所以我可能会选择它。非常酷。谢谢你的例子。我将这样做,您必须设置自己的params.yml,并创建一个使用YAML组件YAML::dump、YAML::parse方法读取和编辑.yml的服务。我不认为这是一条可行的道路,也不认为你想做什么更容易。对于选项3,我的意思是你可以创建一个选项实体,然后根据id找到它,并在需要时编辑它。只需删除id属性上的@ORM\GeneratedValue(strategy=“AUTO”)这一行,添加setId()方法并将其设置为表单中的任意值。
  public function checkCache($data=array(), $path = '')
  {
    foreach ($data as $service => $feed)
    {
      $service = strtolower($service);
      $service =  str_replace(' ', '-', $service);
      $path = $path.'web/bundles/citation/cache/rss/' . $service . '.cache';
      if ((!file_exists($path) || time() - filemtime($path) > 900) && $cache = fopen($path, 'w'))
      {

        $rss_contents = $this->getFeed($feed); //fetch feed content & returns array 
        fwrite($cache, serialize($rss_contents));
        fclose($cache);
        return $rss_contents;
      }
      else
      {

        $cache = fopen($path, 'r');
        return unserialize(file_get_contents($path));
        fclose($cache);

      }
    }
  }