【问题标题】:PHP : Improve loading time of Object-oriented classesPHP:改善面向对象类的加载时间
【发布时间】:2012-12-10 04:36:42
【问题描述】:

注意:这个问题有点长

我有一个基于 PHP 的系统,其 Service-Dao-Model 结构如下:

Service Factory > Foo Service > Core Service > Abstract Service > Service Interface
Dao Factory > Foo Dao > Core Dao > Abstract Dao > Dao
Foo > Core Model > Abstract Model

让我一点一点地解释。我尝试通过在抽象和接口类中定义抽象函数来集中代码,然后在Core Service、Core Dao和Core Model中实现默认行为。

然后,自定义函数写在Foo Service、Foo Dao和Foo Model中。最后,Service Factory & Dao Factory负责在Factory Pattern创建对象。

其他信息:所有类都在__construct() 中附加了log4php 对象。

在目前的开发状态下,我在初始化阶段加载了大约 65 个 PHP 类。通过添加计时器(由microtime(true) 计时),我发现PHP 在加载类时花费的时间最多(0.02119s),接下来是将DB结果集转换为对象值(0.00608s),最后是DB查询时间(0.00223s) )。无法相信类加载时间是数据库查询时间的 10 倍!

问题:如何提高加载类时的 PHP 初始化时间?

版本:PHP 5.2.16,通过 MySQLi PHP 扩展连接到 MySQL 5.1 localhost 服务器

更新 eAccelerator 已预先安装在共享主机中! Zend Engine v2.2.0 with eAccelerator v0.9.6.1

附注如果需要,可以共享代码。

【问题讨论】:

  • 您可能需要考虑使用xdebugxhprof 进行更全面的分析。您可能首先可以改进很多东西。此外,如果您还没有,字节码缓存(通过 APC 和朋友)将大大加快您的初始化阶段。
  • 您有 eAccelerator 或任何其他缓存机制吗?
  • @BenD 没有使用其他缓存机制。将尝试调查 eAccelerator。
  • @Charles 将尝试 xdebug / xhprof 来创建更多的分析细节。
  • 短版:升级到 5.4,因为有很大的优化,尤其是 PHP 处理 OOP 代码的方式。另外,仅供参考,工厂方法是一种反模式。它是过程代码,已被面向对象的工具掩盖。如果你想写出好的 OOP 代码,那么它的任何地方都应该没有静态调用。

标签: php oop design-patterns


【解决方案1】:

如果类加载时间太慢,我会假设您正在使用某种自动加载。考虑一种类似于 Symfony 的 APC 类加载器的方法:

http://symfony.com/doc/current/components/class_loader.html https://github.com/symfony/ClassLoader

其背后的想法是,它将类路径缓存在 APC 中,因此不会为每个请求遍历用于自动加载的包含路径。无论如何,我认为如果实际的 php 加载比 DB 慢,则存在一些架构问题,如果它比 ORM 层慢则更是如此……根据我的经验,加载时间通常是相反的。特别是 PHP 的哪些部分最慢。您可以使用的另一种方法也是 symfony 的一个想法,其中您有一个部署脚本,该脚本在部署时将所有类合并到一个文件中,减少文件系统调用,但我不知道这在您的情况下是否实用,它肯定速度提升。基本上每次你有一个文件系统操作它都非常慢,所以尽可能避免它..

【讨论】:

  • 感谢您的回答,但我没有使用自动加载类。我在需要的时候创建这个类,如果我用完它就将它设置为 null。
  • @ShivanRaptor 什么?如何将类设置为空?您正在编写自己的垃圾收集器吗?
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2016-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多