应该使用shell命令来管理PHP文件吗?
特定的需求是删除一个目录和其中的所有文件,并复制或移动一个目录到一个新的位置,包括所有的文件/目录。
假设脚本仅在Linux操作系统上使用,否则服务器端将采取步骤检测操作系统并执行正确的shell命令。
请给出你的答案的理由。
谢谢
编辑。对Ganesh Ghalame帖子的回应。下面是两者的一些未经测试的实现。为什么要用后者?
<?php
//bla bla bla
rrmdir($dir);
recurse_copy($src,$dst);
rcopy($src, $dst);
?>
//Option command shell commands
<?php
function rrmdir($dir) {
shell('rm -fr '.$dir);
}
function recurse_copy($src,$dst) {
shell('rm -fr '.$dst);
shell('cp '.$src.' '.$dst);
}
function rcopy($src,$dst) {
recurse_copy($src,$dst);
}
?>
//Option using PHP commands
<?php
function rrmdir($dir) {
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object) {
if ($object != "." && $object != "..") {
if (filetype($dir."/".$object) == "dir") rrmdir($dir."/".$object); else unlink($dir."/".$object);
}
}
reset($objects);
rmdir($dir);
}
}
function recurse_copy($src,$dst) {
$dir = opendir($src);
@mkdir($dst);
while(false !== ( $file = readdir($dir)) ) {
if (( $file != '.' ) && ( $file != '..' )) {
if ( is_dir($src . '/' . $file) ) {
recurse_copy($src . '/' . $file,$dst . '/' . $file);
}
else {
copy($src . '/' . $file,$dst . '/' . $file);
}
}
}
closedir($dir);
}
// Function to remove folders and files
function rrmdir($dir) {
if (is_dir($dir)) {
$files = scandir($dir);
foreach ($files as $file)
if ($file != "." && $file != "..") rrmdir("$dir/$file");
rmdir($dir);
}
else if (file_exists($dir)) unlink($dir);
}
// Function to Copy folders and files
function rcopy($src, $dst) {
if (file_exists ( $dst ))
rrmdir ( $dst );
if (is_dir ( $src )) {
mkdir ( $dst );
$files = scandir ( $src );
foreach ( $files as $file )
if ($file != "." && $file != "..")
rcopy ( "$src/$file", "$dst/$file" );
} else if (file_exists ( $src ))
copy ( $src, $dst );
}
?>
与其添加操作系统专用代码,为什么不能使用PHP呢?
- 删除目录PHP Manual rmdir,示例查看
- 复制目录PHP手动复制,示例复制递归
- 移动目录堆栈溢出可能存在副本
使用仅适用于linux的shell脚本的替代方案
system('/bin/rm -rf ' . escapeshellarg($dir));
No。
限定条件:如果存在一个本地PHP函数来满足相同的要求,则不需要。
是否将用户定义的数据提供给shell命令?如果用户添加了一个分号和一些恶意代码怎么办?
阅读这篇文章:http://www.golemtechnologies.com/articles/shell-injection
-
使用shell需要更多的复杂性来确保安全性,所以除非你需要做一些非常晦涩的事情(我想不出任何可以匹配的事情),否则这是一个不必要的风险。
-
Shell参数对特定的操作系统行为进行假设。如果你知道你将永远在debian/redhat/osx/windows上,那么也许你不在乎。也许以后会有人这么做。