php - Autoloader实现,预加载所有类

时间:2016-07-23 04:06:41

标签: php autoloader

我是php的新手并继承了一个包含数百个页面的网站项目,所有程序都是程序化的(当我对文件进行文本搜索时,甚至没有任何函数定义)。我来自c#和Java世界。我正在寻找一种逐步增加OOP的方法。 (他们希望我更新前端,我试图说服他们同时修复后端,他们不想使用框架(该死))。

在研究自动加载器时...嗯,这是我的理解。这是一种注册存储类的文件夹的方法,以及实例化类,特征等时,它会根据类/文件名/命名空间搜索文件夹并加载适当的定义。

我有几个问题:

autoloader是否会搜索该文件夹并在每个页面生命周期中加载适当的定义(或者是否将其缓存)?

预加载: 有没有办法使用自动加载器或其他替代方法将所有类定义预先加载到内存中并使它们在所有会话中可用?

如果是这样,在更新类文件时,当我对类文件进行更改时,如何告诉该机制将所有内容重新加载到内存中?

更新问题:

谢谢你们的答案,这有点帮助,但是...我确实有一个习惯在StackOverflow上提出错误的问题。

我想避免的是通过添加类来减慢页面速度。所以我要说我添加一个库并使用自动加载器注册路径。页面实例化具有多个依赖项的类。假设依赖图包含15个文件。对于每个请求生命周期,服务器只在该页面上加载页面和15个其他文件。

由于我来自编译语言,我觉得有点奇怪没有将这些类加载到内存中。所有课程一起不应超过5MB。

(或者我可能只是创建一个RAM磁盘并在启动时复制那里的所有文件,只有一个符号链接?)

3 个答案:

答案 0 :(得分:1)

我认为您可能会误解自动加载的目的。它只是说明当代码调用PHP无法识别的类时该怎么做。而已。自动加载器只调用requires /path/to/classfile,以便PHP看到该类。

  

自动加载器是否会搜索该文件夹并加载相应的定义   在每个页面生命周期(或它是否缓存它们)?

请求之间没有缓存,因此如果您对文件进行更改,则下一个http请求将包含这些更改。就像您更改了脚本中的任何其他指令一样,例如将echo 1更改为echo 2

  

预加载:有没有办法使用自动加载器或其他替代方法   将所有类定义预加载到内存中并使其可用   在所有会议中?

没有必要这样做。一个写得很好的自动加载器有关于在哪里找到任何类的说明,因此提前加载所有可能的类是浪费的。如果您仍然遇到undefined classes错误,则需要改进自动加载器或根据当前的自动加载器说明放置类文件。

如果您确实要预加载所有课程,请使用auto_prepend_file中的php.ini设置。 The docs say

  

指定在之前自动解析的文件的名称   主文件

将其设置为初始化脚本。在那个脚本中有类似的东西:

//put all your class files in this folder
$dir = '/path/to/classes/folder';
$handle = opendir($dir);

//require all PHP files from classes folder
while (false !== ($item = readdir($handle))){
    $path = $dir.'/'.$item;
    if(is_file($path) && pathinfo($path,PATHINFO_EXTENSION)==='php')
        require_once $path;
}

这是简化的。将任何目录中的所有文件都包含在脚本中会有很大的风险,所以我不会这样做。如果要在子目录中包含文件,还需要调整此项。

基本上,不要这样做。只需要一个好的自动加载器。

答案 1 :(得分:1)

PHP中的自动加载器很懒惰。当PHP遇到使用它不知道的类时,它会要求注册的自动加载器(或自动加载器链)找到它。自动加载器的工作就是找出定义类的文件的位置并包含它。有一些用于命名类和组织类文件的约定是拥有一个有用的自动加载器的关键,并且PHP社区中出现了一些约定,例如PSR-4

  

autoloader是否会搜索该文件夹并在每个页面生命周期中加载适当的定义(或者是否将其缓存)?

每次请求都会调用自动加载器,但只有在需要自动加载类时才会调用。

  

预加载:有没有办法使用自动加载器或其他替代方法将所有类定义预加载到内存中并使它们在所有会话中可用?

我不相信,但随着课程数量的增加,这变得越来越浪费。

欢迎来到遗留PHP的精彩 [citation needed] 世界,我强烈建议您查看Modernizing Legacy Applications In PHP。它就像是从Mordor回到夏尔的战略指南。

答案 2 :(得分:1)

没有人发布我想要的内容,但似乎最好的路线是预装到php 5.5及以上版本的OptCache(我的客户端使用5.3,所以我不知道它)。

https://github.com/zendtech/ZendOptimizerPlus

  

Zend OPcache

     

Zend OPcache通过操作码缓存提供更快的PHP执行   和优化。它通过存储预编译来提高PHP性能   共享内存中的脚本字节码。这消除了阶段   从磁盘读取代码并在将来访问时对其进行编译。在   此外,它应用了一些字节码优化模式   代码执行速度更快。