环境 CentOS 7 PHP 7.2.6

查看 php 所在用户与用户组

为 www:www

将 www 用户添加至 root 权限

visudo
## Allow root to run any commands anywhere
root    ALL=(ALL)       ALL
www     ALL=(ALL) NOPASSWD: ALL

允许 root 用户执行任何命令在任何位置。NOPASSWD  后为执行哪些命令不用输入密码

reboot 重启系统

PHP 测试命令

echo exec('php -v',$a1,$b1);
dump($a1);dump($b1);

echo exec('sudo /opt/mozjpeg/bin/cjpeg -version',$a2,$b2);
dump($a2);dump($b2);

echo exec('sudo /opt/mozjpeg/bin/cjpeg -quality 60 -debug /home/wwwroot/hi.unetu.net/public/tmp/uploads/1.jpeg > /home/wwwroot/hi.unetu.net/public/uploads/1.jpeg',$a3,$b3);
dump($a3);dump($b3);

die();

返回结果

exec 中第三个参数为 0 表示执行成功,其他值如 1 表示失败,上述代码表示执行成功但第二和第三个命令没有返回值也没有输出值

其中第三条 mozjpeg/cjpeg 的压缩图片执行成功

如果想要返回值,查找了一下可以使用管道,在命令添加 2>&1,尝试如下

返回结果

第二条输出了语句,第二条和第三条也都执行成功,但第三条的图片损坏了无法预览

这和在命令行里使用相同命令执行的结果一致

其他尝试

第三条 MozJPEG 如果原图片损坏,则第三条返回 int(1),表示执行失败

参考文献

浅谈PHP的exec()函数无返回值排查方法

https://www.jb51.net/article/110108.htm

发表评论

电子邮件地址不会被公开。 必填项已用*标注