PHP 使用 exec 时缺少系统变量
PHP misses system variables when using exec
所以我有一个项目,我将 spotify 曲目 URL 发送到服务器并存储它。我使用安装了 PHP 7.4 和 windows 11 的 laragon。我使用 that 下载器。它通过 cmd 命令行工作。当我尝试手动使用它时它工作正常,但是当我通过 exec() 发送它时它不起作用。我也无法收到任何 return 消息。我尝试过使用 exec()、system() 和 shell_exec() 函数。问题可能与系统变量有关,因为这些对于 PHP 可能不可见。我也试过打开 on/off 服务器,但没有用。我还尝试将 putenv('PATH=' . $_SERVER['PATH'])
放在文件的开头。我试图检查 laragon 路径变量本身 - 我看不到我添加的这些。任何其他默认 windows 命令都可以正常工作。关于如何修复它有什么想法吗?
这是我的 PHP 代码:
function createFile($url, $token){
function execCommand($dir, $url){
$command1 = "cd $dir";
$command2 = "spotdl $url";
if(!shell_exec($command1. "&& ". $command2)) return false;
return true;
}
$path = "C:\Laragon/laragon/www/temp/";
$dir = $path.$token.'/';
if(!mkdir($dir, 0777)) throwError("Server error");
if(!execCommand($dir, $url)) return false;
return true;
}
我知道我没有 return 从控制台输出任何内容,但那是 post 更新。第二个命令肯定被调用了,我已经在其他一些命令上测试过它(比如 mkdir)
在许多 os 中,命令的错误输出 (stderr) 与正常输出 (stdout) 不同,您需要将错误重定向到 stdout。所以命令必须是:
$ command $arg1 $arg2 ... 2>&1
这导致错误消息将被发送到标准输出,当您使用系统调用时,请记住这一点。
现在在你的代码中我更喜欢使用 php
中的 exec 函数
<?php
$result = 0;
$output = [];
$command = "your command with the 2>&1";
exec($command, $output, $result);
if ($result != 0) {
// here an error ocurred and you can see the error on the ouput array
exit();
}
// here you know that the command was executed successfully
在 re-installing laragon 之后它起作用了。我在卸载路径变量之前已经检查过,但我还没有看到我的应该在里面。
我也修改不了,只好重装了。
所以我有一个项目,我将 spotify 曲目 URL 发送到服务器并存储它。我使用安装了 PHP 7.4 和 windows 11 的 laragon。我使用 that 下载器。它通过 cmd 命令行工作。当我尝试手动使用它时它工作正常,但是当我通过 exec() 发送它时它不起作用。我也无法收到任何 return 消息。我尝试过使用 exec()、system() 和 shell_exec() 函数。问题可能与系统变量有关,因为这些对于 PHP 可能不可见。我也试过打开 on/off 服务器,但没有用。我还尝试将 putenv('PATH=' . $_SERVER['PATH'])
放在文件的开头。我试图检查 laragon 路径变量本身 - 我看不到我添加的这些。任何其他默认 windows 命令都可以正常工作。关于如何修复它有什么想法吗?
这是我的 PHP 代码:
function createFile($url, $token){
function execCommand($dir, $url){
$command1 = "cd $dir";
$command2 = "spotdl $url";
if(!shell_exec($command1. "&& ". $command2)) return false;
return true;
}
$path = "C:\Laragon/laragon/www/temp/";
$dir = $path.$token.'/';
if(!mkdir($dir, 0777)) throwError("Server error");
if(!execCommand($dir, $url)) return false;
return true;
}
我知道我没有 return 从控制台输出任何内容,但那是 post 更新。第二个命令肯定被调用了,我已经在其他一些命令上测试过它(比如 mkdir)
在许多 os 中,命令的错误输出 (stderr) 与正常输出 (stdout) 不同,您需要将错误重定向到 stdout。所以命令必须是:
$ command $arg1 $arg2 ... 2>&1
这导致错误消息将被发送到标准输出,当您使用系统调用时,请记住这一点。
现在在你的代码中我更喜欢使用 php
中的 exec 函数<?php
$result = 0;
$output = [];
$command = "your command with the 2>&1";
exec($command, $output, $result);
if ($result != 0) {
// here an error ocurred and you can see the error on the ouput array
exit();
}
// here you know that the command was executed successfully
在 re-installing laragon 之后它起作用了。我在卸载路径变量之前已经检查过,但我还没有看到我的应该在里面。
我也修改不了,只好重装了。