所以我正在开发一个用旧式(没有OOP)PHP编写的项目,在不久的将来没有完全重写。目前的一个问题是它的速度很慢 - 大部分时间花费require
超过100个文件,具体取决于它在启动过程中的位置。
我想知道我们是否可以将这个(在部署,而不是开发当然)压缩成一个或两个文件,内置所有require
'd文本。但是,因为有很多行不用于每个页面的代码,我想知道这样做是否会适得其反。
我认为,这是一个问题,是否:
<?php
echo 'hello world!';
?>
比
更快<?php
if(FALSE) {
// thousands of lines of code here
}
echo 'hello world!';
?>
如果是这样,速度会慢多少?
(另外,如果由于某些其他原因我上面概述的是一个坏主意,请告诉我。)
答案 0 :(得分:5)
两者之间的差异可以忽略不计。如果当前花费大部分执行时间需要文件,那么使用像APC这样的选项代码缓存可能会显着提升,如果您还没有。
除此之外 - 基准测试,找出确切的瓶颈所在。根据我的经验,要求通常是旧式程序PHP应用程序中最慢的一部分,但即使有很多包含的文件,如果这些都添加到“慢”应用程序,我会感到惊讶。
编辑:好的,快速'肮脏的基准。我创建了三个'hello world'PHP脚本,就像这个例子一样。第一个(basic.php)只是回显字符串。第二个(complex.php)包含一个if false语句,其中包含从另一个应用程序粘贴的~5000行PHP代码。第三个(require.php)包含相同的if语句,但在另一个文件的~5000行代码中需要。
basic.php和complex.php之间的页面生成时间(由microtime()测量)大约为0.000004秒,所以真的不重要。来自apache bench的一些更全面的结果:
without APC with APC req/sec avg (ms) req/sec avg (ms) basic.php: 7819.87 1.277 6960.49 1.437 complex.php: 346.82 2.883 352.12 2.840 require.php: 6819.24 1.446 5995.49 1.668
APC在这方面做得并不多,但耗尽内存,但它可能是现实世界应用程序中的不同画面。
答案 1 :(得分:0)
请记住,PHP会解析它看到的所有代码,即使它没有运行。
处理文件也需要相对较长的时间,而且根据经验,即使没有执行,很多代码也会占用大量内存。
@Tim建议的操作码缓存应该是您的第一个停靠点。
如果这是不可能的(例如由于服务器限制):如果函数以某种方式分成类别,那么使事情变得更快更轻的一种可能性是(ab)使用PHP的Autoloading by将函数放入单独的文件中作为静态类的方法。
function xyz() { ... }
会变成
class generic_tools
{
public static function xyz() { ... }
}
,对xyz()
的任何来电都被generic_tools::xyz();
然后,该通话会触发(例如)generic_tools.class.php
按需,而不是一次性包含所有内容。
这需要重写对静态方法调用的函数调用,这可能很容易或者更难(如果函数调用是动态编写的或者某些东西)。但除此之外,不需要重构,因为你并没有真正使用任何OOP机制。
这实际上有多大帮助在很大程度上取决于应用程序的体系结构以及这些功能相互交织的方式。
答案 2 :(得分:0)
要求确实有一些开销。 100要求可能很多。解析具有100包含的整个文件也可能很慢。来自require的开销可能会花费更多,但很难说。它可能不会花费你。
所有基准都是邪恶的,但这就是我所做的:
运行一个包含大约8000行的文件(每行没有做任何有用的事情,只是声明一个变量)。与运行包含80行文件(相同声明)100次所需的时间相比。结果尚无定论。
文件的包含是否真的导致问题?脚本执行中是否有可以优化的内容?缓存可能是一种选择..