我可以做些什么来提高我的 PHP 脚本的性能/速度而不在我的服务器上安装软件?
13 回答
轮廓。轮廓。轮廓。我不确定 PHP 是否有任何东西,但编写一个小工具在代码中插入分析信息应该很简单。您将需要分析函数时间和 SQL 查询时间。
所以你有一个功能:
function foo($stuff) {
...
return ...;
}
我会将其更改为:
function foo($stuff) {
trace_push_fn('foo');
...
trace_pop_fn('foo');
return ...;
}
(这是函数中的多个返回成为障碍的情况之一。)
和 SQL:
function bar($stuff) {
trace_push_fn('bar');
$query = ...;
trace_push_sql($query);
mysql_query($query);
trace_pop_sql($query);
trace_pop_fn('bar');
return ...;
}
最后,您可以生成程序执行的完整跟踪,并使用各种技术来识别您的瓶颈。
一种可以轻松下架的合理技术是缓存。大量时间倾向于为请求之间(甚至跨客户端)共同的客户端生成资源;消除这种运行时工作可以导致速度显着提高。您可以将生成的资源(或资源片段)转储到 Web 树之外的文件中,然后在需要时将其读回。显然,需要进行一些分析以确保这实际上比重新生成更快 - 强制 Web 服务器定期返回磁盘可能是有害的,因此资源确实需要大量重用。
您可能还会惊讶于编写糟糕的数据库查询花费了多少时间。时间常见的生成查询,看看它们是否可以重写。执行实际 PHP 代码所花费的时间通常非常有限,除非您使用一些次优算法。
这些都不限于 PHP,尽管一些 PHP“神奇”的方法/功能可以过度保护人们不去考虑这些问题。例如,我最近更新了一个脚本,该脚本使用 array_search 对排序数组使用二进制搜索,并获得了预期的指数加速。
真正考虑使用 XDebug 探查器:它有助于检查某个函数的执行量与您的预期相反。
我尝试通过在适当的时候用数组查找替换逻辑来减少指令,同时提高代码的可读性。这就是 Jeff Atwood 在 [The Best Code is No Code][1] 中所写的。
- 此外,避免在另一个循环中出现循环,以及嵌套 if/else 语句。
- 简短的功能。有时,当结果值已知时,不需要执行很多代码。
不必要的测试:
if (count($array) === 0) 返回;
也可以写成:
if (!$array) 返回;
消除了另一个函数调用!
[1]: http: //www.codinghorror.com/blog/archives/000878.html “最好的代码就是没有代码”
你可以用两个基本的东西来优化代码:
优化 PHP 关联库和服务器
通过https://www.digitalocean.com/community/articles/how-to-optimize-apache-web-server-performance或
您可以使用 xhprof 之类的分析工具来查看可以优化的代码部分,下面是链接: http: //michaelsanford.com/compiling-xhprof-for-php-5-4/
使用代码分析器和代码分析器优化您的代码
您需要安装 Netbeans 才能使用此插件。以下是您需要遵循的步骤:
1) 打开 NetBeans,然后从菜单栏工具 > 插件中选择选项。然后在可用的插件选项卡中搜索插件名称“phpcsmd”并从那里安装它。
2)现在打开终端并通过输入命令“sudo su”以超级用户身份出现。
3) 通过在终端中运行以下命令将 PEAR 库(如果未安装)安装到系统中
a) wget http://pear.php.net/go-pear.phar
b) php go-pear.phar
因为我们需要它来安装更多的插件。
4)然后运行命令
"pear config-set auto_discover 1"
这将用于为所需插件设置自动发现路径“true”。所以他们会自动安装到所需的位置。
5) 然后运行下面的命令来安装 PHP 代码嗅探器。
"pear install --alldeps pear/PHP_CodeSniffer"
6) 现在通过运行以下命令安装 PHP Mess Detector
"pear install --alldeps phpmd/PHP_PMD"
如果您在安装此模块时收到“无效的包名称/包文件“phpmd/PHP_PMD””之类的错误。您需要使用此“pear channel-discover pear.phpmd.org”命令来消除此错误。在此命令之后,您可以再次运行上述命令来安装 Mess 检测器。
7) 现在通过运行以下命令来安装 PHP Depend
"pear install --alldeps pdepend/PHP_Depend"
8) 现在通过运行以下命令安装 PHP Copy Paste Detector
"pear install --alldeps phpunit/phpcpd"
9)然后运行命令
"pear config-set auto_discover 0"
这将用于设置自动发现路径“false”。
10)然后打开net beans并按照路径Tools>Options>PHP>PHPCSMD
没有神奇的解决方案,尝试提供通用解决方案很可能只是浪费时间。
你的瓶颈在哪里?例如,您的脚本处理器/数据库/内存是否密集?
您是否进行了任何分析?
包含文件很慢,要求它们更慢。如果您使用 __autoload 包含每个类,那么这将加起来。例如。
如果它牺牲了代码清晰度,我总是有点担心在代码优化方面过于聪明。如果您需要使代码变得模糊以使其快速运行,那么升级硬件而不是浪费时间尝试调整代码不是更便宜吗?毕竟,处理器周期比程序员周期便宜。
我能想到的那些...
循环不变量总是值得关注的。
编写符合 E_STRICT 和 E_NOTICE 的代码,尤其是在记录错误时。
避免使用 @ 运算符。
要求和包含的绝对路径。
尽可能使用 strpos、str_replace 等代替正则表达式。
然后还有许多其他方法可能有效,但可能不会给您带来太多好处。
每当我查看性能问题时,我认为最好的办法是计算页面运行的时间,然后查看最慢的页面。当您获得这些真实指标时,您通常可以通过修复缓慢的 SQL 查询或稍微收紧代码来将最慢的指标的性能提高几个数量级。
这当然不需要新的硬件或特殊软件,只需对现有代码进行批判性观察。
也就是说,这只会工作这么长时间......如果你真的获得足够的流量来达到你的硬件限制,和/或有一些代码本身就很慢并且确实需要,你将不得不看看其他可能性。
我负责一个大型报告系统,我们跟踪最慢的报告。当报告开始时,我将一个唯一键输入数据库,然后当它完成时,我可以确定花费了多长时间。我正在使用数据库,因为这样我可以检测页面何时超时(这比我想要的要多得多)
首先遵循其他一些建议,例如分析和做出良好的资源分配决策,例如缓存。
此外,还要考虑数据库等外部资源的性能。例如,在 MySQL 中,您可以检查慢查询日志。此外,请确保您没有设计数据库而忘记它。针对真实数据优化您的查询(再次针对 MySQL)可能会付出很大的代价。
Rasmus Lerdorf 在他最近在 FrOSCon '08上的演讲“简单就是难”中给出了一些很好的建议。如果您正在使用字节码缓存(并且您真的应该使用一个),包含路径未命中会造成很大的伤害,因此请优化您的 require/require_once。
您可以使用 xhprof 之类的分析工具来查看代码的哪些部分可以优化!
1) 使用最新版本的 PHP
核心团队正在努力提高 PHP 在每个版本中的性能。
2)使用字节码缓存
从 PHP 5.5 开始,一个字节码缓存被添加到 PHP 中,命名为OPcache
. 使用OPcache
可以产生巨大的差异,特别是从 PHP 7 开始。它在每个 PHP 版本中都得到了改进,甚至可能在未来获得 JIT 实现。
3) 剖析
在开发分析时,您可以深入了解到底发生了什么。这有助于发现代码中的瓶颈。
最常用的工具之一是XHProf
但不再受到官方支持,并且 PHP >= 7 存在问题。当您想要分析 PHP >= 7 时,另一种选择Tideways
是XHProf
.