Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/256.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_Performance_Oop_Caching_Object - Fatal编程技术网

PHP对象缓存性能

PHP对象缓存性能,php,performance,oop,caching,object,Php,Performance,Oop,Caching,Object,在磁盘上缓存PHP对象和不缓存PHP对象有区别吗?如果缓存,则只为所有站点访问者创建一次对象,如果不缓存,则为每个访问者创建一次对象。这样做会有性能上的差异吗?还是我会浪费时间 归根结底,主要问题是: 每个用户在内存中有多个对象(每个用户都有自己的实例化对象集) VS 对于所有用户,缓存在文件中的单个对象(所有用户使用相同的对象,例如,相同的错误处理程序类、相同的模板处理程序类和相同的数据库处理程序类)我认为这是在浪费时间,除非生成的数据是静态的且复杂 假设您有一个表示ACL(访问控制列表)的对

在磁盘上缓存PHP对象和不缓存PHP对象有区别吗?如果缓存,则只为所有站点访问者创建一次对象,如果不缓存,则为每个访问者创建一次对象。这样做会有性能上的差异吗?还是我会浪费时间

归根结底,主要问题是:

每个用户在内存中有多个对象(每个用户都有自己的实例化对象集)

VS


对于所有用户,缓存在文件中的单个对象(所有用户使用相同的对象,例如,相同的错误处理程序类、相同的模板处理程序类和相同的数据库处理程序类)

我认为这是在浪费时间,除非生成的数据是静态的且复杂

假设您有一个表示ACL(访问控制列表)的对象,说明哪些用户级别对某些资源具有权限


填充此ACL可能需要相当长的时间,尤其是当数据来自数据库时。缓存的ACL可以更快地实例化。

我使用了缓存SQL查询结果和时间密集型计算结果,并获得了令人印象深刻的结果。现在,我正在开发一个应用程序,它从一个包含200000多条记录的表中获取200多条数据库记录(其中包含大量SQL函数和计算),为每个请求计算从获取的数据得到的结果。我使用Zend Framework的Zend_Cache组件来缓存计算结果,所以下次我不需要:

  • 连接到数据库
  • 等待数据库服务器找到我的记录,计算我的sql函数,返回结果
  • 将至少200条(甚至可能是1000条)记录提取到内存中
  • 检查所有这些数据,计算出我想要从中得到什么
  • 我只是:

  • 调用Zend_Cache::load()方法,该方法将执行一些文件读取

  • 这将在每次请求时为我节省至少4-5秒的时间(非常不准确,我实际上没有分析它。但性能提升是非常明显的)

    在某些情况下可能有用,但在仔细研究影响和其他类型的性能改进(如数据库查询、数据结构、算法等)后会有用

    缓存的查询应该是常量(并且数量有限),数据应该是静态的。为了有效(并且值得),您的硬盘访问速度需要远远快于数据库对该数据的查询速度

    我曾经用它来序列化文件中的缓存对象,在主页上相对静态的内容上,使用一个重载的单实例数据库,以200+点击率/秒的速度运行,并进行不可避免的查询(在我的级别)。在该主页上获得了约40%的性能


    当从头开始开发代码时,代码非常快速和简单,包含pile\u put/get\u内容和un/serialize。您可以根据查询的md5校验和来命名文件。

    要使用这些对象,每个PHP脚本都必须反序列化它们。所以,绝对不是为了节省内存而将它们缓存在磁盘上——它不会节省内存

    缓存这些对象的原因是当创建对象的成本太高时。对于普通PHP对象,情况并非如此。但是,如果该对象表示代价高昂的数据库查询的结果,或者例如从远程web服务获取的信息,那么在本地缓存它可能是有益的

    基于磁盘的缓存不一定是一个巨大的胜利。如果您使用的是PHP并关心性能,那么您必须在操作码缓存环境(如APC或Zend平台)中运行应用程序。这些工具还提供了缓存,可用于在应用程序中保存PHP对象。Memcached也是应用程序数据的快速内存缓存的流行解决方案


    还请记住,并非所有PHP对象都可以序列化,因此不可能将它们保存在缓存中(无论是基于磁盘的缓存还是内存中的缓存)。基本上,如果对象包含对PHP资源的引用,您可能无法序列化它。

    不幸的是,没有正确的答案。在同一台服务器上为同一网站提供相同的解决方案可以提供更好的性能,也可以提供更差的性能。这实际上取决于太多的因素(应用程序、软件、硬件、配置、服务器负载等)

    要记住的几点是: -服务器最慢的部分是硬盘。 -创建对象比访问磁盘要好得多

    =>尽可能远离HD,并尽可能将数据缓存在RAM中

    如果你没有性能问题,我会建议你做。。。没什么

    如果您有性能问题:基准,基准,基准。(找到更好解决方案的唯一真正方法)

    关于该主题的有趣视频:

    在磁盘上缓存PHP对象和不缓存PHP对象有区别吗

    与所有的性能调整一样,你应该衡量你在做什么,而不是盲目地执行一些你不完全理解的巫毒仪式。 在
    $\u会话
    中保存对象时,PHP将捕获对象状态并从中生成文件(序列化)。在下一个请求中,PHP将创建一个新对象,并使用此状态重新填充它。这个过程比仅仅创建对象要昂贵得多,因为PHP必须进行磁盘I/O,然后解析序列化数据。这必须在读写时都发生


    一般来说,PHP被设计为无共享架构。这有其优点和缺点,但试图以某种方式避开它通常不是一个好主意。

    将对象缓存在内存中通常比在磁盘上更好:


    但是,请为自己设定基准并比较结果。这只有您才能确定。

    我要创建的对象不会从数据库中获取,也不会有任何PHP资源。至于Memcached/Zend,由于我正在开发的软件将用于低预算共享web托管解决方案,它将