我最近遇到过两种情况,我选择使用命令行来做某事而不是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行。
答案 0 :(得分:5)
我总是使用这些库:
无需分叉两次(一次用于子shell,另一次用于你正在运行的程序) - 因此更快
无需担心转义命令行参数,这有助于提高安全性
如果担心代码行数,请在函数中将这5行写入一次,然后在需要时调用该函数。
答案 1 :(得分:2)
执行应用程序既有潜在危险,又几乎总是昂贵的操作。您需要正确地转义传递给程序的每个参数,等等。
创建新流程的成本远高于现有流程中的简单功能。
虽然您正在做的事情现在可能正常,但一旦您的应用程序拥有数千个并发用户,它就不会。 (你正在计划那个,不是吗?:))
答案 2 :(得分:1)
使用命令行调用和使用库之间的权衡取决于应用程序的速度以及运行应用程序的计算机的速度。
每次你进行这样的命令行调用时,PHP必须分叉一个进程(实际上是两个shell,然后是你要运行的命令)。这意味着,您的计算机必须启动另一个应用程序。这是一种昂贵的东西,占用了大量的系统资源。想想如果您(或您的启动过程)尝试在您的计算机上同时启动太多程序会发生什么。
使用库时,不必分叉进程。 PHP本身正在完成其他应用程序所做的工作。
也就是说,我已经知道了很多生产Web应用程序,这些应用程序可以通过PHP库调用命令行应用程序。如果它是一个应用程序的流量较低的部分,或者一个不经常被击中的页面,你可能能够逃脱它,但是当你需要扩展时,你会给自己买一个受伤的世界。 / p>
还需要考虑安全性。当您从PHP运行命令时,如果您使用变量来构建命令字符串,则可能存在类似
的风险;rm -rf /
注入你的命令,这将是坏事(rm -rf /将删除你的整个文件系统)。是的,您可以转义输入变量来处理这个问题,但要问任何资深的PHP开发人员如何解决SQL查询的问题。
所以,简而言之,你可能会侥幸逃脱它,但这并不是一种最好的做法,而且当你的球迷击中球迷时,你将在未来为自己买一大堆痛苦。