为何在PHP中使用fastcgi加速器?

4 投票
3 回答
592 浏览
提问于 2025-04-16 03:44

我刚接触网页技术,还在学习阶段。听说fastcgi可以把编译好的(解释过的)PHP代码保存在内存里,那为什么还需要使用操作码缓存(比如apc或eaccelerators)呢?不过我从来没听说过Python有这样的加速器。我觉得既然Python和PHP都是解释型语言,那应该也有Python的加速器吧?如果我错了,请指正我。

非常感谢!

3 个回答

0

当你运行Python程序时,它会先把代码编译成一种叫做字节码的东西(就是那些以.pyc结尾的文件)。这个字节码会被保存下来,不会被丢掉。如果有这个编译好的字节码,Python会直接使用它,而不是再去读原始的源代码。所以,Python其实已经自带了缓存功能,不需要额外再去设置缓存。

2

跟PHP不一样,(C)Python在运行完代码后不会把字节码丢掉。当你导入module.py这个模块时,如果没有module.pyc这个文件,它会把module.py编译成字节码,然后把结果保存到module.pyc里。如果module.pyc已经存在了,就直接使用这个现成的文件,不再编译。你也可以手动对主脚本做同样的事情。

关于

fastcgi会把编译过的(解释过的)PHP代码保存在内存中,那为什么还需要使用操作码缓存(比如apc或eaccelerators)呢?

我之前没听说过这个——FastCGI不会为每个请求启动一个新的进程(这和传统的CGI不同,后者每次请求都会启动一个新的解释器进程),但就这些。这个基准测试显示,FastCGI的性能并没有比mod_php(也就是嵌入在Apache进程中的解释器)更好。

2

PHP在处理完一个文件后,会忘记即时编译的结果。这意味着每次想要从这个文件获取内容时,PHP都需要重新编译一次。为了避免这个问题,可以使用OpCode缓存(就像你提到的那样),它会把PHP类编译后的结果保存在内存中,保持一段时间。

而Python则不一样,它在第一次运行时就会把代码编译成一种更快的可解释代码。你在项目中看到的所有.pyc文件,其实就是Python的OpCode缓存。

PHP的OpCode缓存通常还会包含其他功能(比如内存中的数据存储),而这些功能Python也是自带的。

不过,Python也有一些“加速器”。最著名的一个是Psyco,它声称在理想情况下可以提高“2倍到100倍”的速度。但这需要消耗大量的内存,并且只支持i386架构。

撰写回答