2

我的大部分应用程序都是用 PHP 编写的((前端和后端)。有一部分工作太慢,我需要重写它,可能不是 PHP。什么会给我以下:
1. 最快速度
2。最快的开发
3. 易于维护。

我想在 CPP 中将这段代码重写为 PHP 扩展,但可能是我锁定了这个解决方案而错过了一些更简单/更好的解决方案?

该算法是 PorterStemmerAlgorithm,每次运行时都会处理几 MB 的数据。

4

4 回答 4

9

答案真的取决于它是什么样的过程。

如果它是一个长时间运行的进程(至少几秒钟),那么用 C++ 编写的外部程序可能会非常简单。它不会有 PHP 扩展的复杂性,而且它的稳定性不会影响 PHP/apache。您可以通过管道、共享内存或排序进行通信...

如果它是一个运行时间很短的进程(以毫秒为单位),那么您很可能需要编写一个 PHP 扩展。这将允许非常快速地调用它,几乎没有每次调用的开销。

另一种可能性是自定义服务器,它侦听 Unix 域套接字,并在 PHP 请求信息时快速响应 PHP。然后你的每次调用开销基本上是创建一个套接字(不错)。服务器可以是任何语言(c、c++、python、erlang 等),客户端可以是使用 socket_*() 函数的 50 行 PHP 类。


在做出此决定之前,需要评估大量信息。PHP 通常不会显示减速,直到您进入非常紧密的循环或数千次重复的函数调用。换句话说,HTTP 请求的开销和网络延迟通常使 PHP 延迟微不足道(除非上述情况适用)

  • 也许有更好的方法来用 PHP 编写它?
  • 你是数据库绑定的吗?
  • 是 CPU 绑定、网络绑定还是 IO 绑定?
  • 结果可以缓存吗?
  • 是否已经存在一个库来完成繁重的工作。

通过提交自定义 PHP 扩展,您可以显着增加维护它所需的知识基础(甚至高于 C++)。但在必要时它是一个很好的选择

随时用更多细节更新您的问题,我相信 Stack Overflow 会很乐意提供帮助。

于 2009-02-23T05:00:49.137 回答
3

建议

PorterStemmerAlgorithm 有一个C实现,位于http://tartarus.org/~martin/PorterStemmer/c.txt

将此 C 程序绑定到您的数据源并使其成为独立的可执行文件应该是一件容易的事。然后你可以简单地从 PHP 中使用 proc 函数之一调用它,例如proc_open()

除非您需要根据 php 请求多次调用该程序,否则这种方法应该可以节省您构建和集成 PHP 扩展的工作量,更不用说已经完成了艰苦的工作(在 c 中)。

于 2009-02-23T07:10:39.950 回答
0

我不确定 PorterStemmerAlgorithm 是什么。但是,如果您可以让您的流程并行运行并一起收集信息,您可以查看在 JAVA 中轻松实现的并行运行流程。不确定如何在 PHP 中调用它,但绝对可以维护。

你可以看看这个框架。看起来很容易实现

https://computefarm.dev.java.net/

问候,富兰克林。

于 2009-02-23T06:29:59.860 回答
0

如果您出于速度原因绝对需要用不同的语言重写,那么我认为 gahooa 的答案很好地涵盖了这些选项。但是,在您这样做之前,您是否绝对确定您已经尽一切可能提高 PHP 实现的性能?

  1. 在您的情况下缓存输出是否可行?您能否只运行一次算法并缓存输出而不是每次加载页面?
  2. 您是否尝试过分析代码以确保没有完成不必要的工作(内部循环中的数据库查询等)。Xdebug 可以在这里提供帮助。
  3. 是否有其他可用的词干提取算法可能在您的数据集上表现更好?
于 2009-02-23T07:35:30.640 回答