Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ImageMagick convert在命令行中工作,但不能通过PHP exec()工作_Php_Linux_Imagemagick_Centos - Fatal编程技术网

ImageMagick convert在命令行中工作,但不能通过PHP exec()工作

ImageMagick convert在命令行中工作,但不能通过PHP exec()工作,php,linux,imagemagick,centos,Php,Linux,Imagemagick,Centos,我使用PHP的exec()转换图像,使用ImagicMagick的convert。这是在CentOS服务器上运行的 exec(convert http://www.google.com/images/srpr/logo3w.png.jpg -resize 640 /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg); 使用exec()不会导致新图像出现在目标文件夹中。然而,如果我在shell中运行相同的命

我使用PHP的
exec()
转换图像,使用ImagicMagick的
convert
。这是在CentOS服务器上运行的

exec(convert http://www.google.com/images/srpr/logo3w.png.jpg 
    -resize 640 /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg);
使用
exec()
不会导致新图像出现在目标文件夹中。然而,如果我在shell中运行相同的命令,它将完美地工作


我认为这是一个路径问题。如果是,如何检查PHP正在使用的路径,以及如何在PHP中设置正确的路径?

首先,您应该尝试使用确实存在且可检索的输入文件:

wget http://www.google.com/images/srpr/logo3w.png.jpg --2012-08-21 20:55:24-- http://www.google.com/images/srpr/logo3w.png.jpg Resolving www.google.com (www.google.com)... 173.194.35.179, 173.194.35.177, 173.194.35.178, ... Connecting to www.google.com (www.google.com)|173.194.35.179|:80... connected. HTTP request sent, awaiting response... 404 Not Found 2012-08-21 20:55:24 ERROR 404: Not Found. 及

最后,还可以尝试使用
转换的完整路径:

exec(/usr/local/full/path/to/convert logo: 
-resize 640 /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg);
然后

identify /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg
ls -l  /home/mysite/public_html/public/img/posts/original/touchtest

更新: 您要检索的文件可能不是
logo3w.png.jpg
,而是
logo3w.png

wget http://www.google.com/images/srpr/logo3w.png --2012-08-21 21:04:22-- http://www.google.com/images/srpr/logo3w.png Resolving www.google.com (www.google.com)... 173.194.35.180, 173.194.35.177, 173.194.35.179, ... Connecting to www.google.com (www.google.com)|173.194.35.180|:80... connected. HTTP request sent, awaiting response... 200 OK Length: 7007 (6.8K) [image/png] Saving to: ‘logo3w.png’ 100%[=====================================================>] 7,007 --.-K/s in 0.02s 2012-08-21 21:04:22 (451 KB/s) - ‘logo3w.png’ saved [7007/7007] 另外,检查您运行PHP的用户帐户是否确实有权写入目标目录:

exec(touch /home/mysite/public_html/public/img/posts/original/touchtest);
然后

identify /home/mysite/public_html/public/img/posts/original/1414_301a4.jpg
ls -l  /home/mysite/public_html/public/img/posts/original/touchtest

对我有效的是提供了
ImageMagick
二进制文件的完整路径。使用
/path/to/convert
,而不是
convert

$command = $this->imageMagickFullBinaryPath . ' -resize ' . $dimensions . 
           ' ' . $imageFileToResize . ' ' . $resultingThumbnail; 
exec($command, $output);

运行php的任何程序都可能无法写入目标文件夹。可能是某种www user.Is
convert
在shell PHP将启动以运行命令的路径中?一个简单的
echo$PATH
exec会告诉你。哎呀,我在这里漏掉了引号,它肯定在我使用的实际代码中。目录的文件夹权限应该是什么?777? 目前是755。更改文件夹的所有者/组会有帮助吗,还是会把事情搞砸?我对要写入Imagemagick的文件夹执行了
chmod 777
,现在它可以与
exec()
一起工作。我也有同样的问题,但liferay有同样的问题。在终端工作,但不在liferay。哦!最后有人认为逃避必要的实践:
function execute($command)
{
    # remove newlines and convert single quotes to double to prevent errors
    $command = str_replace(array("\n", "'"), array('', '"'), $command);
    # replace multiple spaces with one
    $command = preg_replace('#(\s){2,}#is', ' ', $command);
    # escape shell metacharacters
    $command = escapeshellcmd($command);
    # execute convert program
    return shell_exec($command); // or whatever you like
}
$command = $this->imageMagickFullBinaryPath . ' -resize ' . $dimensions . 
           ' ' . $imageFileToResize . ' ' . $resultingThumbnail; 
exec($command, $output);