XAMPP下Windows系统中PHP运行速度慢100倍问题的解决方法

22

我的Windows台式机上运行PHP非常缓慢,以至于打开数据库需要几分钟时间。以下是运行简单PHP测试程序所需的时间比较:

  • 运行XAMPP的Windows 8.1机器:3597毫秒
  • iPage共享主机:65毫秒
  • A2Hosting共享主机:26毫秒

以下为测试程序代码...

<?php
$rStartTime = microtime(true);
$countTo = 100000;
$a = 0;
//$countTo = $countTo * 100;
for ($x = 0; $x <= $countTo; $x++) {
    $a = sqrt(pow($x, 2));
}
$rMs = floor((microtime(true) - $rStartTime) * 1000);
echo 'timer done, countTo=' . $a . ' ms=' . $rMs;

在Firefox中输入"http://localhost/timer.php",即可运行测试程序而无需进行调试。

本地机器通常非常快。 它正在运行...

  • Windows 8.1
  • XAMPP 1.8.3 (控制面板v3.2.1)
  • Apache 2.4.4(最新版本为2.4.20)
  • PHP 5.5.3
  • 防恶意软件 = Windows Defender
  • IDE = PHPStorm 10.0.2

是什么导致PHP运行变得如此缓慢?

12个回答

33

我发现问题出在xampp\php\php.ini中的Xdebug。尝试了网上找到的多种解决方案,以下是它们的结果:

以管理员身份运行XAMPP并重新启动服务器:3617毫秒

在xampp/apache/conf/httpd.conf中,将localhost替换为127.0.0.1并重新启动服务器:3639毫秒

在Windows/System32/drivers/etc/hosts中,添加“127.0.0.1 127.0.0.1”和“127.0.0.1 localhost”,然后重启Windows:3960毫秒

在Windows/System32/drivers/etc/hosts中,取消注释“127.0.0.1 localhost”,然后重启Windows:3659毫秒

在php.ini中,取消注释zend_extension="C:\xampp\php\ext\php_eaccelerator_ts.dll",然后重新启动服务器:3643毫秒

在php.ini中,设置xdebug.remote_enable=0:3598毫秒

在php.ini中,设置remote_host="localhost":3593毫秒

在php.ini中,设置xdebug.profiler_enable=0:249毫秒

在php.ini中,注释掉所有的Xdebug语句:27毫秒 - 成功了!

不幸的是,我犯了错误,需要使用Xdebug :-(


3
你能在启用Xdebug的情况下解决这个问题吗?我也遇到了同样的麻烦。 - rck6982
但我写了一个 Delphi 程序,可以在两个 php.ini 文件之间切换,一个是调试的(称为 debugPhp.ini),一个是非调试的(称为 fastPhp.ini)。 - CaptureWiz
这里似乎没有任何Xdebug选项。我猜XAMPP默认不带Xdebug,我的瓶颈可能在其他地方? - DaVince
我的XAMPP 3.2.1附带了一个php.ini文件,底部有一个[XDebug]部分。 - CaptureWiz
1
XAMPP 上没有这样的东西。 - Michael Rogers
显示剩余4条评论

11

我使用xdebug idekey设置(xdebug.idekey="xdebug1")和chrome扩展程序xdebug helper(https://chrome.google.com/webstore/detail/xdebug-helper/eadndfjplgieldjbigjakmdgkmoaaaoc)解决了我的问题。

*别忘了禁用remote_autostart (xdebug.remote_autostart=0)

只有在请求时激活调试(xdebug),使用idekey设置,因此如果不需要调试,php处理可以更快/正常,通过chrome扩展按钮切换

我在Windows 10 64位上使用xampp 1.8.3, 我使用自定义idekey,xdebug.idekey="xdebug1",与xdebug helper设置相同

[XDebug]
zend_extension = "E:\xampp183\php\ext\php_xdebug.dll"
xdebug.profiler_append = 0
xdebug.profiler_enable = 1
xdebug.profiler_enable_trigger = 0
xdebug.profiler_output_dir = "E:\xampp183\tmp"
xdebug.profiler_output_name = "cachegrind.out.%t-%s"
xdebug.remote_enable = 1
xdebug.remote_autostart=0
xdebug.idekey="xdebug1"
xdebug.remote_handler = "dbgp"
xdebug.remote_host = "127.0.0.1"
xdebug.trace_output_dir = "E:\xampp183\tmp"
xdebug.remote_log="E:\xampp183\tmp\xdebug\xdebug.log"

setting1

enter image description here

enter image description here

现在只有当通过Xdebug助手请求会话时,断点/调试才会激活。


感谢Dzikri提供这个富有想象力和详细的解决方案!我测试了一下,确实将速度提高了2倍!但即使使用了你的提示,php运行仍然很慢 :-( 正常时间=3597ms。使用Dzikri的提示,关闭调试后时间缩短到1482ms,开启调试后为1478ms(奇怪的更快了!?)。但是通过在php.ini中注释掉Xdebug部分,时间缩短到27ms。 - CaptureWiz
很高兴能够帮忙,可能是因为不同的本地设置、不同的电脑规格,导致结果有所不同。在我的情况下,如果与让xdebug自动启动=on相比,它可以加速达到90%。 - Nuha Dzikri
1
这让我的本地连接时间从10-30秒加速到了2-4秒,这是一个巨大的改进,谢谢! - Sean Kendle
如果您不需要分析性能,请确保关闭该设置,否则可能会导致巨大的减速。请将以下两行代码添加到您的配置文件中:xdebug.profiler_enable = 0 xdebug.profiler_enable_trigger = 0 - Nuha Dzikri
在 Xdebug 3 中,xdebug.remote_autostart=0 变成了 xdebug.start_with_request=no - KalenGi

10
我在Windows Defender中排除了我的网站文件夹和Xampp文件夹,问题就解决了。
打开Defender并转到首选项/设置(这里我使用的是德语版本的“Einstellungen”),然后排除文件/文件夹,在那里使用按钮获取文件对话框,您可以指向您的文件/文件夹。

谢谢Carsten,那是一个我没有想到的好主意!我测试了一下,确实加快了2倍!但即使有你的提示,速度还是很慢 :-( 正常时间=3597ms。使用Carsten的提示=1509ms。注释掉Xdebug:27ms。 - CaptureWiz
你能简要解释一下这是如何实现的吗? - ju_
1
打开Defender并转到首选项/设置(我在这里使用德语版本的“Einstellungen”),然后排除文件/文件夹,使用按钮获取文件对话框,在那里您可以指向您的文件/文件夹。 - Carsten Wartmann
我尝试了所有的方法,但只有这个有效。谢谢你,伙计!你真是我的救星。我排除了整个xampp文件夹,页面加载时间从15-20秒降至不到1秒。 - Pankaj

2

我曾经遇到过与xampp有关的同样问题,而问题出在WINDOWS DEFENDER上。如果你关闭了Windows Defender的保护,xampp就会变得更快(正常速度),同时你也可以将xampp文件夹添加到Windows Defender的排除列表中。这就是解决方案。


已确认在Windows 10 Pro上。Magento 2上的Composer更新从93秒降至32秒。 - Paul Bönisch
谢谢,但是Carsten在2017年4月已经建议过这个方法了,请参见上文。这个修复可以提高2倍的性能,但是PHP仍然比没有安装Xdebug时慢50倍。 - CaptureWiz
2
但是禁用Windows Defender的xampp的确切步骤是什么?这个答案没有告诉我。 - warmwhisky
2
但是禁用Windows Defender的xampp的确切步骤是什么?这个答案没有告诉我。 - warmwhisky

1
运行TS(线程安全)版本的php会严重降低速度。通常情况下不需要使用TS,因此请使用NTS(非线程安全)版本的php。
[编辑补充,来自Quora] Thread Safe(TS)和Non-Thread Safe(TS)是两种不同的PHP构建版本。
线程安全确保当共享数据结构被不同线程操作时,它是免于竞争条件的。这个版本推荐在Web服务器同时运行多个执行线程处理不同请求的情况下使用。
例如,在Apache服务器中,如果我们使用mod_php作为工作MMP,则应该使用线程安全版本。
另一方面,非线程安全版本用于安装PHP作为CGI二进制文件的情况。这里每个请求都是独立处理的,这消除了线程安全版本的需求。此外,在这里使用线程安全版本会由于不必要的线程安全检查而降低性能。像IIS和NGINX这样的服务器不需要线程安全版本。

这是一个非常棒的想法,没有其他人提到过,谢谢!如何运行线程安全版本? - CaptureWiz
如果您正在自行编译PHP,我相信标志是--enable-zts或--enable-maintainer-zts,具体取决于您的PHP版本。如果您只是下载二进制文件,则可以选择哪个版本。例如,对于Windows,下载位于https://windows.php.net/download/上。在该页面上,它会指定您要下载的版本是TS还是NTS。 - Dakusan
谢谢Dakusan,我会在几个月后开始编程PHP时测试您的建议。 - CaptureWiz

0
对于Chrome用户:我发现(在尝试了上面所有的提示后)Chrome扩展程序“Evernote Web Clipper”也会减慢Chrome的速度。 当加载一个没有任何包含的纯URL时: 启用/禁用Evernote Web Clipper:0.7毫秒/ 0.25毫秒

0

如果您在 PHP 脚本中使用 mysql 数据库,请检查您的数据库连接配置。

如果 db 主机在 Windows(10)上,请使用 127.0.0.1 而不是 localhost。


谢谢,但没有数据库修改可以解决PHP本身的缓慢问题。MySQL和其他PHP程序一样运行缓慢。在上面的速度测试中,我尝试将localhost更改为127.0.0.1,并在php.ini等其他地方进行了尝试,但遗憾的是,这并没有帮助太多。 - CaptureWiz
最近我也遇到了非常类似的问题,尝试了很多技巧和窍门。目前脚本的平均执行时间并不算太差(可以用于开发目的),但仍然没有达到更快的速度。将mysqli连接设置(localhost改为127.0.0.1)可以使执行速度提高约十倍。我还修改了Apache httpd的“ServerName”,修改了虚拟主机等,此外我关闭了IPv6(网络适配器设置),关闭/添加了Win Defender的例外,但所有这些修改几乎没有任何作用。 - qwaevisz

0

1
考虑到您使用绝对路径,这并不是一个好主意。 - Fernando Torres

0

我发现 Eclipse 没有正常结束 XDebug 会话。我通过重新启动调试会话并正确结束它来解决了这个问题。


你是如何正确地重新启动和结束XDebug会话的? - CaptureWiz
我猜我关闭了 Eclipse 而没有结束 XDebug 会话,这意味着我没有在菜单中点击红色框(终止)。第二天打开 phpMyAdmin 时速度非常慢。重新打开 Eclipse,开始调试会话,并通过单击红色框图标正确地结束它解决了问题。 从那以后,我通常在不同的浏览器(chrome)中打开 phpMyAdmin,而不是在调试时使用 Firefox。 - Zudi

0

对我来说,McAfee Web Boost 扩展是阻碍因素。我移除了这个扩展,现在速度提升了90%。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接