【问题标题】:PHP exec split command on linux serverLinux服务器上的PHP exec split命令
【发布时间】:2011-10-22 10:59:40
【问题描述】:

我有一个运行 ubuntu 10.10 maverick 的 linux 服务器,安装了 apache 和 php,在 /var/www 目录中我有一个下载目录。我使用了 OSFile 管理器并修改为包含一个拆分文件的功能,这里是代码:

function spl($fname){
 global $folder;
 if (!$fname == ""){
    maintop("Split");
    $dirfile = $folder.$fname;

    \\escape directory path
    $dirfile = str_replace(" ","\ ",$dirfile);
    $dirfile = str_replace("(","\(",$dirfile);
    $dirfile = str_replace(")","\)",$dirfile);
    $command = "split -d -b1024m ".$dirfile." ".$fname."_";
    echo "Command: ".$command;
    echo"<br />";


    $returnval =0;
    unset($output2);
    $output = exec($command,$output2,$returnval);

    //echo results
    echo($output);
    echo"<br />";
    print_r($output2);
    echo"<br />";
    echo($returnval);
    echo"<br />";
    mainbottom();
 }
  else
    home();
}

命令不执行。文件和目录是正确的,但它返回退出代码 1,并且 Array() 作为输出值,我创建了一个包含几个用户的组,我让这个组成为 downloads/ 的所有者,并赋予它读写和执行权限,该组包括 www-data。

我们将不胜感激任何帮助

【问题讨论】:

  • 提示 1:使用 addcslashesescapeshellarg。提示 2:如果您没有捕获任何错误消息,请查看 error.log
  • error.log 位于何处?我试过 escapeshellarg 但它没有对文件路径做任何事情。
  • 这是一个网络服务器文件。通常在 docroot 之上。如果需要,Escapeshellarg 在周围添加单引号和反斜杠。
  • 我读到它应该转义一个将作为 shell 命令传递的字符串,但它没有转义空格或 (),我检查了 /var/log/apache2/error.log但它是空的
  • 如果用单引号括起来,则不需要进一步转义,确实如此。如果你没有得到任何日志条目,或者找不到它们,那么将你的 exec 语句包装在 exec("sh -c \" $cmd 2&gt;&amp;1\"");

标签: php linux split exec


【解决方案1】:

如果您没有从 exec 收到任何错误消息并且 error.log 保持为空,则使用此包装器执行:

 exec("sh -c \" $cmd 2>&1 \"");

2&gt;&amp;1stderr 频道重定向到stdout,以便它显示在结果数组中。
In the shell, what does " 2>&1 " mean?

另一个选项是proc_open,您可以在其中单独读取每个频道,但设置工作量更大。

【讨论】:

    【解决方案2】:

    试试这个文件拆分类

    Split and merge files

    或者这个使用 exec Split big files using PHP using exec

    【讨论】:

    • 您好,我正在调查您链接的课程,如果它有效,会通知您。我在那个问题上,我正在正确执行命令(我已经在 shell 中测试过),但它不能通过 php 工作
    猜你喜欢
    • 1970-01-01
    • 2019-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2015-07-24
    • 1970-01-01
    • 2012-08-22
    相关资源
    最近更新 更多