Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP何时应该执行shell,vs内部PHP函数。演出安全_Php_Linux_Performance - Fatal编程技术网

PHP何时应该执行shell,vs内部PHP函数。演出安全

PHP何时应该执行shell,vs内部PHP函数。演出安全,php,linux,performance,Php,Linux,Performance,我是Linux系统管理员,总是在Bash中工作。我对管理PHP非常有经验,但对编写PHP脚本相当陌生 我希望从系统命令而不是PHP内部函数获得输出的原因是什么。我假设您有可移植性方面的顾虑,尽管在我的案例中这不是一个问题 比如说,, 我可以得到一个带有ls的目录列表和一个exec风格的函数。 或者使用opendir('.')和一个循环执行某些操作 性能考虑因素是什么 这就是我现在所拥有的 <?php // Directory Open $myDirectory = opendir('/me

我是Linux系统管理员,总是在Bash中工作。我对管理PHP非常有经验,但对编写PHP脚本相当陌生

我希望从系统命令而不是PHP内部函数获得输出的原因是什么。我假设您有可移植性方面的顾虑,尽管在我的案例中这不是一个问题

比如说,, 我可以得到一个带有ls的目录列表和一个exec风格的函数。 或者使用opendir('.')和一个循环执行某些操作

性能考虑因素是什么

这就是我现在所拥有的

<?php
// Directory Open
$myDirectory = opendir('/media/ARCHIVE/Documents/conf/web_confs');

// Array of Elements
while($entryName = readdir($myDirectory)) {
$dirArray[] = $entryName;
}
// Directory Close
closedir($myDirectory);

// Sort Array
sort($dirArray);
?>

有没有一种更有效的方法来取代这个循环?性能确实很重要,在我的例子中,这些将被制作成类似代码片段的东西

这是与系统相关的代码,不会接受任何类型的输入。甚至从一个URL地址也没有。此外,环境是大规模的,所有系统都经过性能调整并经常进行分析

所以,我一直在寻找最好的方法。
我非常感谢您的任何意见,因为我的经验有点有限。

对于这个具体案例,我会使用scandir()

使用PHP的内置函数来完成这些事情可能会更快,因为我想执行exec()会有一些开销。老实说,我不认为您会有性能问题,除非您在一个脚本中获得数千次目录列表。另外,如果你真的在意的话,可以对其进行基准测试,但我认为你会进行一些微优化,而这些优化并不会带来显著的改进。(过早优化是万恶之源!)


如果您接受用户输入而不对其进行清理,则会出现安全问题。在清理然后传递给exec()的输入时,我会非常小心。

以您读取目录为例,在PHP中执行操作肯定会比让操作系统加载过程更快

至于安全性:与通过shell启动进程相比,PHP的内置函数的安全性问题更少。(比如PHP的
system
函数)如果在shell命令中使用用户的输入,那么启动shell尤其危险:您必须确保无论用户可能输入什么,您都知道您构造的shell命令将执行什么操作!(这类似于SQL注入,如果您熟悉的话。)PHP提供了这方面的函数,并在
system
exec
的手册页面中记录它们


也就是说,使用用户输入读取目录也有安全考虑(在一般情况下)。始终确保根据您的情况对用户的输入进行清理。如果他们可以读取任何目录,
opendir(\u users\u input)
可能就可以了。如果他们只能读取
/foo/bar
中的任何内容,那么您可能需要确保他们没有传递给您
。/../etc/passwd

,我并不是说PHP函数速度较慢,因为它们大多映射到底层C库函数。自定义可执行文件当然是另一回事

使用exec意味着复制整个进程内存(我知道,跳过这里的vfork)并用新的可执行文件替换进程内存,从而分叉进程。后者实际上相当快。我想说,普通的C2D系统每秒可以处理几千个执行者

我希望从系统命令而不是PHP内部函数获得输出的原因是什么

你自己给他们起的名字——你对他们很熟悉。
够了

至于性能,这并不重要

瞧,你只关心系统的最小部分。
为了处理用户请求,web服务器将执行数百次这样的磁盘查找。为什么你不关心他们?但是您只想超级复制额外的微优化这一个。
你甚至不知道这是不是必需的。

这是没有逻辑的

执行bash命令通常会比较慢。
有两种情况可能需要调用外部bash命令

  • 当PHP没有内置库支持(或需要安装PECL包)时。例如rsync、wget、seige、mysqldump、ab(apachebenchmark)。此时,您会发现执行外部命令更容易

  • bash脚本可以获得比PHP内置函数更好的结果,例如您的示例。或者另一个例子:-
    du-h$dir | sort-nr

  • 正如其他人已经指出的那样,如果性能是一个问题,那么做基准测试并比较自己。
    如果出于安全考虑,执行外部bash命令的风险更高


    如果扫描目录确实存在瓶颈,
    您应该考虑缓存到允许快速访问的存储区,例如APC、MyCache。 您可以轻松地创建一个钩子/触发器,使目录上有写活动的缓存过期

    一个例子

    if ( cache_found())
    {
      // return results from cache
    }
    else
    {
      // scan dir
      // set the scan result into cache
      // return scan result;
    }
    

    通过这种典型的命中或未命中技术,您的性能可以得到相当好的提升。

    TechZilla-听起来您和YC之间存在误解。我会忽略它

    我有两个有用的输入:

    1。我最可靠的直觉是坚持PHP调用,而不是放弃另一个进程


    分叉一个新的进程可以做各种有趣的事情:文件句柄和状态副本、整个堆栈的备份、寄存器状态的备份、内存位置的重新定位、从磁盘加载新的可执行文件、加载每个尚未加载的共享库、指令和数据寄存器的跳变实际上是数千次(这意味着很多可能的cpu内存缓存未命中!)对于内存位置修补来说,这是一个非常头痛的问题


    函数调用(甚至是C绑定)只是堆栈上的一点额外空间和一些指令指针跳转。第一次加载应用程序时,它将处理加载任何依赖库(上面定义的头痛问题),但