Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.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 Zend_Db性能_Php_Performance_Zend Db - Fatal编程技术网

Php Zend_Db性能

Php Zend_Db性能,php,performance,zend-db,Php,Performance,Zend Db,在对要在一个相当大的应用程序中实现的不同库/框架(350个表db,一些表上有数百万个条目)进行了一些研究之后,我发现Zend_db可以很容易地完成我想做的事情:在数据库之间快速切换的适配器管理 问题是性能确实很低,下面是一个示例($db是一个基本适配器,时间仅在选择/获取上计算): SQL查询(用于测试的查询,表包含约200个元素) 基本PDO-0.6392s $db = new PDO('mysql:dbname=etab_191;host=127.0.0.1', 'root'); for (

在对要在一个相当大的应用程序中实现的不同库/框架(350个表db,一些表上有数百万个条目)进行了一些研究之后,我发现Zend_db可以很容易地完成我想做的事情:在数据库之间快速切换的适配器管理

问题是性能确实很低,下面是一个示例($db是一个基本适配器,时间仅在选择/获取上计算):

SQL查询(用于测试的查询,表包含约200个元素)

基本PDO-0.6392s

$db = new PDO('mysql:dbname=etab_191;host=127.0.0.1', 'root');
for ($i=0; $i<2000; $i++) {
    $stmt = $db->query($sql);
    $p = $stmt->fetch(PDO::FETCH_OBJ);
    $stmt->closeCursor();
}
$db=newpdo('mysql:dbname=etab_191;host=127.0.0.1','root');
对于($i=0;$iquery($sql);
$p=$stmt->fetch(PDO::fetch_OBJ);
$stmt->closeCursor();
}
当前应用程序数据库管理器-0.7401s(mysqli核心功能上的简单抽象层)

$db=GestionConnexionBDD::getInstance('default',1)->gestionBDD;
对于($i=0;$iquery($sql);
$p=$db->fetchObject($res);
$db->freesult($res);
}
Zend_Db手动查询-1.0647s(Mv_Core_Db_Manager是基于Zend的抽象层,返回Zend_Db_Adapter_摘要列表)

$db=Mv\u Core\u db\u Manager::getInstance()->getAdapter('default',1);
对于($i=0;$iquery($sql);
$p=$stmt->fetch();
$stmt->closeCursor();
}
Zend_Db_Table_Abstract查询-3.6702s(与Zend_Db_Table_Abstract一起调整::setDefaultMetadataCache($cache))

$elmt=新元素();
对于($i=0;$i发现(2);
}
查询循环会破坏zend的性能。我知道这不是最好的做法,但应用程序已经开发好了,我希望尽可能少地修改代码


一些想法?我做错什么了吗?

抽象是有代价的

Zend是一个php框架,比pdo等本机扩展慢得多。 Zend_DB/Zend_DB_表在运行时创建大量类实例。 也许你可以用字节码缓存(比如apc)或内置zend服务器快速运行你的应用程序


也许对你来说也是一个解决方案。

抽象是有代价的

Zend是一个php框架,比pdo等本机扩展慢得多。 Zend_DB/Zend_DB_表在运行时创建大量类实例。 也许你可以用字节码缓存(比如apc)或内置zend服务器快速运行你的应用程序

也许对你来说也是一个解决方案。

几点提示:

  • 由于增加了对象化的开销,使用表/行类总是会稍微慢一点(若这是一个单词;)
  • 在我的工作场所,我们在使用doctrine(1.2)时遇到了类似的问题,在接下来的几周里,我们将进行试验(遗憾的是,那篇文章中的图像已经消失了)
  • 我以为Zend_Db有一个查询缓存机制,但我在参考指南中找不到关于它的信息
    • 几点提示:

      • 由于增加了对象化的开销,使用表/行类总是会稍微慢一点(若这是一个单词;)
      • 在我的工作场所,我们在使用doctrine(1.2)时遇到了类似的问题,在接下来的几周里,我们将进行试验(遗憾的是,那篇文章中的图像已经消失了)
      • 我以为Zend_Db有一个查询缓存机制,但我在参考指南中找不到关于它的信息

      Zend_DB_Abstract将在每个PHP请求上查询表元数据

      这意味着要做一个DB描述表,这在某些数据库上可能非常慢

      为了避免这种情况,您可以缓存此类元数据,这将提高查询性能:

          /////////////////////////////
          // getting a Zend_Cache_Core object
          $cache = Zend_Cache::factory('Core',
              'File',
              array('lifetime' => 86400, 'automatic_serialization' => true ),
              array('cache_dir' => $config->cacheDir));
      
          // Next, set the cache to be used with all table objects
          Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
      

      Zend_DB_Abstract将在每个PHP请求上查询表元数据

      这意味着要做一个DB描述表,这在某些数据库上可能非常慢

      为了避免这种情况,您可以缓存此类元数据,这将提高查询性能:

          /////////////////////////////
          // getting a Zend_Cache_Core object
          $cache = Zend_Cache::factory('Core',
              'File',
              array('lifetime' => 86400, 'automatic_serialization' => true ),
              array('cache_dir' => $config->cacheDir));
      
          // Next, set the cache to be used with all table objects
          Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);
      

      我想您的Zend_Db_Table_Abstract示例代码中有一个错误:
      $Db->fetchAll($sql);
      不适合。谢谢,我将其改为fetchOne()。不过,我想知道为什么您在Zend_Db_Table_Abstract类上执行find(),在Zend_Db_Adapter类上执行fetch操作;)哦,我错了,我的示例:)我认为Zend_Db_Table_Abstract的示例代码中有一个错误:
      $Db->fetchAll($sql)不适合。谢谢,我将其改为fetchOne()。不过,我想知道为什么要在Zend_Db_Table_抽象类上执行find(),在Zend_Db_Adapter类上执行fetch操作;)糟糕的是,我错误地选择了我的例子:)这是事实,但我想知道我是否也做错了什么,然后再放弃一个更简单的解决方案。我不得不说,我对多个查询的低性能感到惊讶,但也许Zend并没有像Those那样做。Zend Framework只是另一个层,它用东西创建、解析和生成类对象,而不仅仅是传递数组。如果在如此大的数据库结构中,ZDB增加了大量开销,我也不会感到惊讶。我能想到的唯一一件事是,Zend Server应该能够很好地与Zend框架一起工作,并编译代码以实现优化和性能。但我从未尝试过。这是事实,但我想知道我是否也做错了什么,然后再放弃一个更简单的解决方案。我不得不说,我对多个查询的低性能感到惊讶,但也许Zend并没有像Those那样做。Zend Framework只是另一个层,它用东西创建、解析和生成类对象,而不仅仅是传递数组。如果在如此大的数据库结构中,ZDB增加了大量开销,我也不会感到惊讶。我能想到的唯一一件事是,Zend Server应该能够很好地与Zend框架一起工作,并编译代码以实现优化和性能。我从来没有尝试过,我是Zend Framework(ZF)的常客,虽然我的应用程序都不是eno
      
          $db = Mv_Core_Db_Manager::getInstance()->getAdapter('default', 1);
      for ($i=0; $i<2000; $i++) {
          $stmt = $db->query($sql);
          $p = $stmt->fetch();
          $stmt->closeCursor();
      }
      
      $elmt = new Element();
      for ($i=0; $i<2000; $i++) {
          $elmt->find(2);
      }
      
          /////////////////////////////
          // getting a Zend_Cache_Core object
          $cache = Zend_Cache::factory('Core',
              'File',
              array('lifetime' => 86400, 'automatic_serialization' => true ),
              array('cache_dir' => $config->cacheDir));
      
          // Next, set the cache to be used with all table objects
          Zend_Db_Table_Abstract::setDefaultMetadataCache($cache);