exec 函数在 PHP 中不起作用

exec function is not working in PHP

in php exec 函数对 运行 一个 shell 命令不起作用。

如果我在终端运行

   $ avconv -i in.mp4 -f mp3 -ab 192000 -vn rip.mp3 

该命令运行良好,该命令用于将视频转换为 mp3。 但是当我尝试通过 PHP 执行时,它就是行不通。

   exec("avconv -i in.mp4 -f mp3 -ab 192000 -vn rip.mp3");

或者如果我尝试 exec("whoami");给我正确的输出。

您很可能需要为命令提供文件的完整路径,因为 PHP 中的当前目录与 shell 中的当前目录不同。

exec("avconv -i /path/to/in.mp4 -f mp3 -ab 192000 -vn /path/to/rip.mp3");

为了安全起见,甚至 aconv 的完整路径:

exec("/bin/avconv -i /path/to/in.mp4 -f mp3 -ab 192000 -vn /path/to/rip.mp3");

检查 aconvwhich aconv 的正确路径是什么。

要检查是否有任何错误,请将第二个参数添加到 exec 命令并打印它:

exec('...', $result);
var_dump($result);

好的,这是一个文件权限问题。 www-data 没有写入文件的权限,更改权限后现在可以使用了。

您需要按照以下步骤操作。

  • 首先检查exec()函数是否存在

    if(function_exists('exec')){
       echo 'Function exists';
    }else{
       echo 'Function does not exists';
    }
    
  • 如果它存在,那么您的执行代码中可能存在语法错误。如果它不存在,请使用下面给出的函数在 php.ini 下检查它是否被禁用。

    function disabled_functions(){
      $disabled = explode(',', ini_get('disable_functions'));
      return $disabled;
    }
    echo "<pre>";
    print_r(disabled_functions());
    

    以上函数会列出php.ini.

  • 中所有禁用的函数
  • 如果上述disabled_functions()的输出中存在exec。然后转到 /etc/php.ini 并从 disable_functions

  • 中删除 exec
  • 保存php.ini文件后重启php-fpm。如果是 Redhat/CentOS 7 和 Fedora。 sudo systemctl restart php-fpm

如果您使用的是 Cpanel 和 WHM 面板

  • 执行文件可能未在 php.ini 文件的 disable_functions 中列出。

  • 从 WHM 面板登录,转到 MultiPHP 管理器,单击系统 PHP-FPM 配置选项卡,然后转到禁用功能。现在从这里删除 exec.

  • 删除后保存并重启PHP-FPM.

  • 如果您没有 WHM 面板访问权限,您可能无法使用此功能。因此,请求您的托管服务提供商为您的帐户提供 shell 访问权限和执行权限。