15

我可以做些什么来提高我的 PHP 脚本的性能/速度而不在我的服务器上安装软件?

4

13 回答 13

19

轮廓。轮廓。轮廓。我不确定 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 ...;
}

最后,您可以生成程序执行的完整跟踪,并使用各种技术来识别您的瓶颈。

于 2008-08-15T18:34:49.957 回答
8

一种可以轻松下架的合理技术是缓存。大量时间倾向于为请求之间(甚至跨客户端)共同的客户端生成资源;消除这种运行时工作可以导致速度显着提高。您可以将生成的资源(或资源片段)转储到 Web 树之外的文件中,然后在需要时将其读回。显然,需要进行一些分析以确保这实际上比重新生成更快 - 强制 Web 服务器定期返回磁盘可能是有害的,因此资源确实需要大量重用。

您可能还会惊讶于编写糟糕的数据库查询花费了多少时间。时间常见的生成查询,看看它们是否可以重写。执行实际 PHP 代码所花费的时间通常非常有限,除非您使用一些次优算法。

这些都不限于 PHP,尽管一些 PHP“神奇”的方法/功能可以过度保护人们不去考虑这些问题。例如,我最近更新了一个脚本,该脚本使用 array_search 对排序数组使用二进制搜索,并获得了预期的指数加速。

于 2008-08-15T22:50:50.767 回答
6

真正考虑使用 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 “最好的代码就是没有代码”

于 2008-09-17T21:39:20.310 回答
5

你可以用两个基本的东西来优化代码:

优化 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

于 2014-06-06T04:53:01.900 回答
3

没有神奇的解决方案,尝试提供通用解决方案很可能只是浪费时间。

你的瓶颈在哪里?例如,您的脚本处理器/数据库/内存是否密集?

您是否进行了任何分析?

于 2008-08-15T18:28:47.317 回答
2

包含文件很慢,要求它们更慢。如果您使用 __autoload 包含每个类,那么这将加起来。例如。

如果它牺牲了代码清晰度,我总是有点担心在代码优化方面过于聪明。如果您需要使代码变得模糊以使其快速运行,那么升级硬件而不是浪费时间尝试调整代码不是更便宜吗?毕竟,处理器周期比程序员周期便宜。

于 2008-09-17T21:50:21.673 回答
1

我能想到的那些...

  • 循环不变量总是值得关注的。

  • 编写符合 E_STRICT 和 E_NOTICE 的代码,尤其是在记录错误时。

  • 避免使用 @ 运算符。

  • 要求和包含的绝对路径。

  • 尽可能使用 strpos、str_replace 等代替正则表达式。

然后还有许多其他方法可能有效,但可能不会给您带来太多好处。

于 2008-08-19T14:59:57.500 回答
0

每当我查看性能问题时,我认为最好的办法是计算页面运行的时间,然后查看最慢的页面。当您获得这些真实指标时,您通常可以通过修复缓慢的 SQL 查询或稍微收紧代码来将最慢的指标的性能提高几个数量级。

这当然不需要新的硬件或特殊软件,只需对现有代码进行批判性观察。

也就是说,这只会工作这么长时间......如果你真的获得足够的流量来达到你的硬件限制,和/或有一些代码本身就很慢并且确实需要,你将不得不看看其他可能性。

于 2008-08-15T18:29:48.483 回答
0

我负责一个大型报告系统,我们跟踪最慢的报告。当报告开始时,我将一个唯一键输入数据库,然后当它完成时,我可以确定花费了多长时间。我正在使用数据库,因为这样我可以检测页面何时超时(这比我想要的要多得多)

于 2008-08-15T22:49:29.303 回答
0

首先遵循其他一些建议,例如分析和做出良好的资源分配决策,例如缓存。

此外,还要考虑数据库等外部资源的性能。例如,在 MySQL 中,您可以检查慢查询日志。此外,请确保您没有设计数据库而忘记它。针对真实数据优化您的查询(再次针对 MySQL)可能会付出很大的代价。

于 2008-08-15T23:06:04.823 回答
0

Rasmus Lerdorf 在他最近在 FrOSCon '08上的演讲“简单就是难”中给出了一些很好的建议。如果您正在使用字节码缓存(并且您真的应该使用一个),包含路径未命中会造成很大的伤害,因此请优化您的 require/require_once。

于 2008-09-17T22:43:02.733 回答
0

您可以使用 xhprof 之类的分析工具来查看代码的哪些部分可以优化!

于 2013-08-31T07:38:30.777 回答
0

1) 使用最新版本的 PHP

核心团队正在努力提高 PHP 在每个版本中的性能。

2)使用字节码缓存

从 PHP 5.5 开始,一个字节码缓存被添加到 PHP 中,命名为OPcache. 使用OPcache可以产生巨大的差异,特别是从 PHP 7 开始。它在每个 PHP 版本中都得到了改进,甚至可能在未来获得 JIT 实现

3) 剖析

在开发分析时,您可以深入了解到底发生了什么。这有助于发现代码中的瓶颈。

最常用的工具之一是XHProf但不再受到官方支持,并且 PHP >= 7 存在问题。当您想要分析 PHP >= 7 时,另一种选择TidewaysXHProf.

于 2017-12-27T11:39:06.513 回答