对Class Loader进行缓存

3.4 版本
维护中的版本

要找到一个特定的类的文件,代价可能很高。幸运的是,ClassLoader组件内置了两个类,用于缓存“从类到类所在的文件”之映射关系。 ApcClassLoaderXcacheClassLoader 都可以打包儿出来一个实现了 findFile() 方法的类,用于找到类的文件。

ApcClassLoaderXcacheClassLoader 都可以用于缓存Composer的 autoloader

ApcClassLoader 

ApcClassLoader 对一个现有的类加载器打包,并使用 APC 来对载器的 findFile() 方法调用,进行缓存:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require_once '/path/to/src/Symfony/Component/ClassLoader/ApcClassLoader.php';
 
// instance of a class that implements a findFile() method, like the ClassLoader
// 一个实现了findFile()方法的类的实例,类似于ClassLoader
$loader = ...;
 
// sha1(__FILE__) generates an APC namespace prefix
// sha1(__FILE__) 生成一个APC命名空间前缀
$cachedLoader = new ApcClassLoader(sha1(__FILE__), $loader);
 
// register the cached class loader / 注册已缓存的类加载器
$cachedLoader->register();
 
// deactivate the original, non-cached loader if it was registered previously
// 如果原来的未被缓存的loader已经注册过,对其反激活
$loader->unregister();

XcacheClassLoader 

XcacheClassLoader 使用 XCache 来缓存类加载器。注册它是很简单的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require_once '/path/to/src/Symfony/Component/ClassLoader/XcacheClassLoader.php';
 
// instance of a class that implements a findFile() method, like the ClassLoader
// 一个实现了findFile()方法的类的实例,类似于ClassLoader
$loader = ...;
 
// sha1(__FILE__) generates an XCache namespace prefix
// sha1(__FILE__) 生成一个XCache命名空间前缀
$cachedLoader = new XcacheClassLoader(sha1(__FILE__), $loader);
 
// register the cached class loader / 注册已缓存的类加载器
$cachedLoader->register();
 
// deactivate the original, non-cached loader if it was registered previously
// 如果原来的未被缓存的loader已经注册过,对其反激活
$loader->unregister();

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)