2

我最近遇到了两种情况,我选择使用命令行而不是 PHP 库来做某事。例如,在 PHP 中这样做:

`curl http://someplace.com`

而不是这个:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_exec($ch);
curl_close($ch);

另一种情况是使用 ImageMagick 的命令行界面,而不是 PHP 界面。

一些与我交谈过的人认为使用库更好。有人说更好更快,有人说更安全,等等。

你有什么意见?使用其中一种有什么好处?

我知道一个好处,就是我只有一行代码而不是 5 行。

4

3 回答 3

5

我总是使用这些库:

  1. 无需分叉两次(一次用于子外壳,另一次用于您正在运行的程序)-因此更快

  2. 无需担心转义命令行参数,这有助于安全

如果担心代码行数,将这 5 行代码写在一个函数中,然后在需要时调用该函数。

于 2009-03-16T22:21:47.990 回答
2

执行应用程序既具有潜在危险,又几乎总是一项昂贵的操作。除其他事项外,您需要正确转义您传递给程序的每个参数。

创建一个新进程的成本也远高于在现有进程中调用一个简单函数。

虽然您现在所做的工作可能很好,但一旦您的应用程序有数千个并发用户,它就不会了。(你正在计划,不是吗?:))

于 2009-03-16T22:22:36.757 回答
1

使用命令行调用和使用库之间的权衡是应用程序的速度和运行应用程序的计算机的速度。

每次您进行这样的命令行调用时,PHP 都必须派生一个进程(实际上是两个,shell 和您要运行的命令)。这意味着,您的计算机必须启动另一个应用程序。这是一个消耗大量系统资源的昂贵的东西。想想如果您(或您的启动过程)尝试在您的计算机上一次启动太多程序会发生什么。

当您使用库时,无需派生任何进程。PHP 本身正在做其他应用程序会做的工作。

也就是说,我知道很多生产 Web 应用程序都可以通过调用 PHP 库无法使用的命令行应用程序来摆脱困境。如果它是应用程序的低流量部分,或者是一个不经常被点击的页面,你可能能够逃脱它,但是当你扩大规模时,你给自己买了一个受伤的世界。

还需要考虑安全性。当您像这样从 PHP 运行命令时,如果您使用变量来构建命令字符串,您将面临类似的风险

;rm -rf /

被注入到您的命令中,这会很糟糕(rm -rf / 将删除您的整个文件系统)。是的,您可以转义您的输入变量来处理这个问题,但是请询问任何资深的 PHP 开发人员如何手动转义 SQL 查询。

So, in short, you can probably get away with it, but it's not a best practice and you're buying yourself a load of pain in the future when the s--- hits the fan.

于 2009-03-17T06:23:40.517 回答