我尝试根据 Symfony 文档将以下命令行传递给 Symfony Process 组件:
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;
$process = new Process(['cat crons/* | crontab -']);
$process->run();
还有以下内容:
$process = new Process(['cat crons/*', '|', 'crontab -']);
和:
['cat crons/*', '|', 'crontab', '-']
但是它不起作用,它出现了异常:
The command "'cat /var/www/config/crontab/* | crontab -'" failed.
Exit Code: 127(Command not found)
Working directory: /var/www
Output:
================
Error Output:
================
sh: exec: line 1: cat /var/www/config/crontab/* | crontab -: not found
请问有人有解决办法吗?
文档说:
使用参数数组是定义命令的推荐方法。这可以帮助您避免任何转义,并允许无缝发送信号(例如,在进程运行时停止进程):
$process = new Process(['/path/command', '--option', 'argument', 'etc.']); $process = new Process(['/path/to/php', '--define', 'memory_limit=1024M', '/path/to/script.php']);
如果您需要使用流重定向、条件执行或操作系统 shell 提供的任何其他功能,您还可以使用
静态工厂将命令定义为字符串。fromShellCommandline()
因此,如果您以数组形式提供命令,则不要将整个命令放入单个数组参数中。而且,如果您尝试执行重定向之类的操作,则根本不使用数组。
use Symfony\Component\Process\Exception\ProcessFailedException;
use Symfony\Component\Process\Process;
$process = Process::fromShellCommandLine('cat crons/* | crontab -');
try {
$process->run();
} catch (ProcessFailedException $e) {
...
}