【问题标题】:PHP5 performance comparison, Windows and LinuxPHP5性能对比,Windows和Linux
【发布时间】:2011-12-06 03:55:27
【问题描述】:

我有一个关于 Symfony2 性能的问题。

我已经在 Ubuntu 11.04 下使用 Symfony2 开发了几个星期,Apache 2.2.17、PHP 5.3.5、APC 3.1.9,没有 xDebug

在开发环境中,Symfony2 工具栏上给出的时间从未超过 70 毫秒。

今天,我尝试在 Windows 7 环境中安装我的应用程序:Wampserver 2.2、PHP 5.3.8、Apache 2.2.21、APC 3.1.7,没有 xDebug

windows环境下的电脑比ubuntu(SSD、四核等)的电脑好很多。

当我在开发环境中运行应用程序时,工具栏总是显示至少 300 毫秒。

那么,你知道这是怎么可能的吗?

谢谢!

编辑:找到有关该主题的链接:http://fossplanet.com/f6/%5Bsymfony-users%5D-symfony2-slow-windows-xp-116465/

我也注意到了 file_exists 函数的问题(使用 webgrind)。

那么,有什么想法吗?

也许这个话题已经讨论过了,但我很惊讶没有找到任何相关的东西。

【问题讨论】:

  • fossplanet.com URL 似乎已损坏

标签: php performance apc


【解决方案1】:

TL;DR;将 realpath_cache_size 设置为 > 1000

编辑 2: 此 PR 中解决的问题:尝试将 PHP.ini 的 realpath_cache_size 设置为 > 1000 的值 最近添加了一个 symfony 要求来解决这个问题:https://github.com/sensiolabs/SensioDistributionBundle/commit/cf0179711b24d84d4a29d71a4010540f4c990bd8

编辑:我刚刚看到这个答案:https://stackoverflow.com/a/17914570/980547 当我在我的 php.ini 中设置 realpath_cache_size=4096k 时,它在 Windows 上将页面生成时间减少了 4(!)

旧答案:

所以,我用 webgrind 对两者进行了比较:

在windows(快速电脑)上,调用app_dev.php:

因此您可以看到 Web 工具栏显示了 764 毫秒的时间生成(由于 xDebug 和分析而增加,但仍然相关)。 Webgrind 显示:

  • 651 次调用 file_exists() 时间为 232 毫秒(这是很多!)
  • 603 次调用 filemtime() (211ms)
  • 230 次 UniversalClassLoader 调用->loadClass() (119ms)
  • 230 次 UniversalClassLoader 调用->findFile() (38ms)

在linux(慢速电脑)上,app_dev.php:

298 毫秒的总生成时间(比 Windows 上的时间少两倍多)。

  • 237 次 UniversalClassLoader->findFile() 调用(36 毫秒 => 少 4 倍)
  • 对 UniversalClassLoader->loadClass() 的 237 次调用(20 毫秒 => 减少 2 倍)
  • 623 次调用 file_exists()(仅 4 毫秒!!!)
  • 605 次调用 filemtime()(仅 4 毫秒!!!)

问题似乎是 file_exists() 和 filemtime(),它们在 windows 上比在 Linux 上慢得多。在 Windows 上,PHP 60% 的时间都在寻找带有 file_exists、filemtime、loadClass 或 findFile 的文件。这是一个已知问题吗?

编辑:所以问题只存在于开发环境,在生产中没有 file_exists 完成,因为一切都被缓存了。

【讨论】:

  • 很好的发现。我相信file_exists()filemtime() 是为了检查配置是否已更改。有没有办法像 sf1 那样阻止这些调用并手动清除缓存?
  • 是的,当然在生产中没有这样的调用,但有趣的是Windows和Linux在开发环境中的区别。
【解决方案2】:

我刚开始在 Windows 下使用 Symfony2 进行开发,这真是让人头疼 - 我测试了 xcache、apc 和 eaccelerator,它们要么几乎没有区别,要么在与 xdebug 一起使用时崩溃了。

现在我发现了微软的 WinCache——它让 Windows 下的 Symfony2 速度快得令人难以置信…… 我的请求花费了 1.5 秒到 3 秒之间的时间 - WinCache 下降到 200 毫秒。而且它甚至不会打扰 xdebug - 分析和调试仍然像魅力一样工作。
编辑:这都是关于开发环境的。

唯一的缺点是它只能在 nts php 上运行,我认为 apache 模块需要 ts - 如果你用 fcgid 运行它,虽然你不会有任何问题。

我不敢相信没有这个怪物我工作了这么多年......

链接:
WinCache on php.net
Official WinCache site
Binaries

【讨论】:

  • 一位同事发现 WinCache 覆盖了一些 PHP 函数并在 Windows 优化行为中重新实现 - file_exists 就是其中之一:php.net/manual/en/wincache.reroutes.php
  • 值得注意的是,WinCache 仅在使用 IIS 时应用
  • 呃,不是吗?我在测试中使用 nginx 和 PHP 而不是 fastcgi。
【解决方案3】:

尝试使用 ApcUniversalClassLoader http://symfony.com/doc/2.0/book/performance.html

【讨论】:

  • 它已经完成了,但只在生产环境中使用:在开发环境中,“调试”加载器被自动使用。我的问题是:为什么 windows 比 linux 慢?
  • @Nanocom 认真的吗?众所周知,linux 比 windows 好、快很多年了。就是这样。
  • 你不会让我相信 fle_exists 和 filemtime 在 Windows 上确实比在 linux 上慢 50 倍。
【解决方案4】:

发现有趣!

我想说,因为这根本不是 symfony2 的问题,所以它必须在 PHP 二进制文件中修复..

但是,谁在 Windows 上运行他的网络服务器呢? :D

【讨论】:

  • 谁经营他们?在windows下开发的人,也许吧?你会惊讶我们有多少人;)我个人:家里的窗户,工作的Linux。无论如何,我认为您基本上是对的,这与 Windows 下的 PHP 或 Apache 有很大关系。
  • 有些开发者必须使用windows才能符合公司的规定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-18
  • 2023-03-29
  • 1970-01-01
  • 2012-08-06
  • 2018-12-15
  • 2014-12-23
  • 2014-08-02
相关资源
最近更新 更多