Php 一个文件中的动态类定义
我只能有一个php文件 我只需要在某些情况下定义一个类来生成输出 大概是这样的:Php 一个文件中的动态类定义,php,Php,我只能有一个php文件 我只需要在某些情况下定义一个类来生成输出 大概是这样的: if (date("j") == "1") { echo "Not today"; exit; } new OutputGenerator(); class OutputGenerator { // very large definition (~3500 lines) } 这段代码的问题是PHP处理整个文件,这使得脚本非常慢。没有类声明,我每秒可以处理约500个请求。根据定义(即使我
if (date("j") == "1") {
echo "Not today";
exit;
}
new OutputGenerator();
class OutputGenerator {
// very large definition (~3500 lines)
}
这段代码的问题是PHP处理整个文件,这使得脚本非常慢。没有类声明,我每秒可以处理约500个请求。根据定义(即使我在定义之前退出),我只得到~50,这是90%的性能下降
有条件地要求外部文件声明可以解决我的问题,但我需要留在这个文件中
有没有办法(除了使用eval()或需要具有该定义的外部文件)做到这一点?解析php文件的时间不应该太长。。我认为问题在于OutputGenerator的构造函数中正在进行一些昂贵的操作 您可以有条件地创建OutputGenerator的一个实例来规避此开销
if($iNeedAnOutputGenerator){
$og = new OutputGenerator();
}
php文件的解析时间应该不会花那么长。。我认为问题在于OutputGenerator的构造函数中正在进行一些昂贵的操作 您可以有条件地创建OutputGenerator的一个实例来规避此开销
if($iNeedAnOutputGenerator){
$og = new OutputGenerator();
}
由于您的脚本非常小,我同意您的想法,即您的性能可能会显著降低。您正在做的任何事情都不是资源密集型的,因此我可以看到,在这种情况下,大型类定义可能会显示出明显的差异 如果解析是个问题,最明显的答案是使用操作码缓存。在PHP5.5中,这是内置的,但是对于之前的任何PHP版本,都应该使用
即使没有APC,我认为对于这样一个简单的脚本,每秒50个请求的速度也很低,而且您可能会在某个地方遇到完全不同的瓶颈。由于您的脚本非常小,我相信您的性能会显著降低。您正在做的任何事情都不是资源密集型的,因此我可以看到,在这种情况下,大型类定义可能会显示出明显的差异 如果解析是个问题,最明显的答案是使用操作码缓存。在PHP5.5中,这是内置的,但是对于之前的任何PHP版本,都应该使用
即使没有APC,我认为对于这样一个简单的脚本,每秒50个请求也是很低的,您可能在某个地方遇到了一个完全不同的瓶颈。如果您对文件的其余部分使用
else
语句,会有帮助吗?您能否确认是类定义而不是其构造导致了性能下降?更大的问题是,类的实例化没有分配给我认为所有的事情都是在构造函数中完成的,因为没有参数,所以可能所有的事情都使用全局函数。问题是,即使没有初始化类,性能也会下降。该类只是位于文件的末尾(它实际上是一个LESS>CSS解析器),从未调用,从未实例化,只在同一个文件中。当我从外部文件中请求它时,性能将恢复到每秒约500个请求。我相信这是PHP内部的事情,它会将所有类读入内存,并在以后使它们可用。如果对文件的其余部分使用else
语句,会有帮助吗?能否确认是类定义而不是其构造导致性能下降?更大的问题是,类的实例化没有分配给我认为所有的事情都是在构造函数中完成的,因为没有参数,所以可能所有的事情都使用全局函数。问题是,即使没有初始化类,性能也会下降。该类只是位于文件的末尾(它实际上是一个LESS>CSS解析器),从未调用,从未实例化,只在同一个文件中。当我从外部文件中请求它时,性能将恢复到每秒约500个请求。我相信这是PHP内部的事情,它将所有的类读入内存,然后使它们可用。类内的操作不是问题。即使我从未调用/实例化该类,也会发生这种情况。那么条件包含是唯一的方法。。。除非你想做一些疯狂的事情,比如把定义放在一个字符串中,然后有条件地对它求值。。。但这太疯狂了,我认为对于一个包含3500 loc的类定义,您可能需要重新评估您的解决方案。我同意,但是这个类不是我的代码,我只是使用它。无论如何谢谢你的帮助,我会继续尝试,稍后会发布一些结束语。课堂内的操作不是问题。即使我从未调用/实例化该类,也会发生这种情况。那么条件包含是唯一的方法。。。除非你想做一些疯狂的事情,比如把定义放在一个字符串中,然后有条件地对它求值。。。但这太疯狂了,我认为对于一个包含3500 loc的类定义,您可能需要重新评估您的解决方案。我同意,但是这个类不是我的代码,我只是使用它。无论如何谢谢你的帮助,我会继续尝试,并在稍后发布一些结论。