【问题标题】:Would it be simply better to use the system's functions rather than use the language?使用系统的功能而不是使用语言会更好吗?
【发布时间】:2011-02-17 14:16:15
【问题描述】:

在很多情况下,我质疑 PHP 的某些功能的性能,以及我是否应该构建一个复杂的类来使用其看似缓慢的工具来处理特定的事情。

例如,使用sed 的复杂正则表达式和使用awk 的处理在性能上似乎是指数级的,而不是让PHP 的正则表达式和看似过多的函数解析并及时完成它。如果我要同时执行许多网络任务,例如 MX 查找/挖掘/检索,我宁愿通过 system() 传递它,让操作系统自己处理。 PHP 中的函数太多了,效率低下,导致页面变慢,或者操作系统可以更轻松地处理。

你有什么意见?

您认为我应该在操作系统自身/自定义功能中进行艰苦的工作吗?

【问题讨论】:

    标签: php linux performance operating-system


    【解决方案1】:

    系统调用通常比使用 PHP 构建的解决方案更快(尽管这并不总是正确的,因为 PHP 的函数本身是用 C 构建和编译的。许多 PHP 核心函数和扩展都非常快)。

    除了速度之外,第二个因素是内存限制。外部调用的进程不会影响 PHP 的 per-script 限制,这在处理大文件时非常有用。

    另外,有些函数在 PHP 本身中根本不可用。例如,无法完全在 PHP 中模仿 ImageMagick 的功能集。 GD 库无法与 ImageMagick 提供的功能相媲美。

    最大的缺点是通过使用系统命令,您有效地消除了可移植性,这是 PHP 美的一部分。将应用程序移动到不同的服务器会成为一个巨大的负担,因为外部命令的功能集需要相同 - 即使在不同的 Linux 发行版中也并非总是如此,更不用说跨越操作系统边界进入 Windows 或 Unix - 基于 Mac 操作系统。在这方面,我自己遇到过wget 和 ImageMagick 的问题,我相信还有更多。

    如果您正在开发您完全控制服务器环境的自定义应用程序(以及决定在未来五年内购买哪种服务器),那可能不是问题。但是,如果您构建需要可移植的软件,它将是一个。

    我个人倾向于删除一个功能(需要外部依赖项)而不是失去可移植性,但是,我非常热衷于构建可移植的应用程序。这真的取决于你的注意力。

    【讨论】:

    • 关于 ImageMagick 的主题:查看 PHP Imagick 扩展开发者的博客以获取一些很酷的示例:valokuva.org/?cat=1
    【解决方案2】:

    即使系统进程更快并且占用更少的内存(这里必须进行广泛的测试),也有一些事情需要记住:

    我会谨慎使用system() 调用,并且仅在您控制脚本将在其上运行的硬件时使用它。使用这些调用可能会导致需要安装更多的软件/包,并且可能无法在所有操作系统上工作(以相同的方式),所以如果你无法控制服务器,我会坚持使用 PHP 函数。

    【讨论】:

      【解决方案3】:

      我认为这实际上会更慢,因为每次调用这样的函数时,操作系统都会启动一个新进程,这很耗时。

      【讨论】:

        【解决方案4】:

        我想说,如果你的程序打算使用其他外部程序(如 sed/awk)在 shell 上执行,那很好,因为 shellscripts 也会过度使用外部程序,并且在 shell 上运行的 php 脚本就像 shell脚本,只是用另一种语言。 但是,如果它是一个 Web 应用程序,最好在 php 中进行 - 大多数共享托管环境不允许您从 php 脚本执行外部程序。

        【讨论】:

          【解决方案5】:

          (我的经验是“系统调用”通常是指调用内核操作——而不是调用其他程序——“通过 system() 传递它并让操作系统处理它”——你似乎也这么想——但没有一个您提到的程序是操作系统服务-它们只是其他程序。

          PHP 本质上是一种脚本语言 - 通常它只是在其他程序之间移动数据的粘合剂,但需要考虑一些事项:

          1) 性能 - 分叉一个新进程的计算成本可能很高

          2) 安全性 - 让您的网络服务器无限制地访问系统上的所有程序(即使受权限限制)可能非常危险

          3) 请记住 (2) 大多数配置会阻止或限制您可以执行的操作

          4) 对于大规模开发,这是相当危险的 - 让程序员用他们选择的任何语言编写代码,然后在顶部略读 PHP,这意味着您最终会得到一个用许多不同语言编写的应用程序

          5) 您可以非常轻松地编写自己的原生代码 PHP 扩展

          如果我要执行大量网络任务,例如 MX 查找/挖掘/检索

          虽然我相信使用 awk/sed 混搭大型数据集可能比原生 PHP 代码更快/更高效,但我发现使用不同的客户端更快地进行 DNS 查找有点令人惊讶。你是如何衡量这个的?

          【讨论】:

            猜你喜欢
            • 2019-11-21
            • 1970-01-01
            • 2017-09-28
            • 1970-01-01
            • 2020-04-30
            • 2011-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多