题
无需在服务器上安装软件,如何提高 PHP 脚本的性能/速度?
解决方案
轮廓。轮廓。轮廓。我不确定 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 在 [最好的代码就是根本没有代码][1] 中所写的。
- 另外,避免在另一个循环内循环,然后嵌套如果/其他语句。
- 短函数。有时,当已经知道结果值时,不需要执行很多代码。
不必要的测试:
if (count($array) === 0) 返回;
也可以写成:
如果 (!$数组)返回;
又消除了一个函数调用!
[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 detector。
7) 现在通过运行以下命令来安装 PHP 依赖项
"pear install --alldeps pdepend/PHP_Depend"
8) 现在通过运行以下命令安装 PHP 复制粘贴检测器
"pear install --alldeps phpunit/phpcpd"
9)然后运行命令
"pear config-set auto_discover 0"
这将用于设置自动发现路径“false”。
10)然后打开net beans并按照路径Tools>Options>PHP>PHPCSMD
没有神奇的解决方案,尝试提供通用解决方案很可能只是浪费时间。
你的瓶颈在哪里?例如,您的脚本是处理器/数据库/内存密集型的吗?
您进行过任何分析吗?
包含文件很慢,而需要它们则更慢。如果您使用 __autoload 来包含每个类,那么这就会增加。例如。
我总是有点担心在代码优化方面过于聪明,因为这会牺牲代码的清晰度。如果您需要使代码变得晦涩难懂以使其更快,那么升级硬件而不是浪费时间尝试调整代码不是更便宜吗?毕竟,处理器周期比程序员周期便宜。
我能想到的那些...
循环不变量 总是一个好观看的好人。
编写e_trict和e_notice符合符合代码的代码,尤其是在记录错误时。
避免使用 @ 运算符。
绝对路径的需求和包括。
使用 strpos、str_replace 等。尽可能代替正则表达式。
还有许多其他方法可能有效,但可能不会给您带来太多好处。
每当我查看性能问题时,我认为最好的办法是计算页面运行的时间,然后查看最慢的页面。当您获得这些真实指标时,通常可以通过修复缓慢的 SQL 查询或稍微收紧代码来将最慢查询的性能提高几个数量级。
这当然不需要新的硬件或特殊的软件,只需要对现有代码进行批判性的关注。
也就是说,这只能持续这么长时间......如果您确实获得了足够的流量来达到硬件的极限,和/或某些代码本质上很慢并且确实需要,那么您将不得不考虑其他可能性。
我负责一个大型报告系统,我们跟踪类似的最慢的报告。当报告开始时,我向数据库触发一个唯一的密钥,然后当报告完成时,我可以确定它花了多长时间。我使用数据库是因为这样我可以检测页面何时超时(这种情况发生的次数比我想要的要多得多)
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
.