我正在尝试使用imagemagick命令"convert“从.png镜像创建.tif镜像。
我带来的是:
$exec = "/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif";
exec($exec);如果我运行CLI“that”,我会得到路径:/opt/local/bin/convert。我也尝试过不带path,只有/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif和/etc/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif。
如果我在终端中运行该命令,它会按预期工作,但当我尝试从PHP脚本使用它时,它不能工作。
编辑:我也尝试过用以下代码创建一个.sh文件,但没有成功:
#! /bin/bash
convert -adaptive-resize 150% 1.png 1.tif
convert -adaptive-resize 150% 2.png 2.tif
convert -adaptive-resize 150% 3.png 3.tif
convert -adaptive-resize 150% 4.png 4.tif
convert -adaptive-resize 150% 5.png 5.tif
convert -adaptive-resize 150% 6.png 6.tif
convert -adaptive-resize 150% 7.png 7.tif
convert -adaptive-resize 150% 8.png 8.tif
convert -adaptive-resize 150% 9.png 9.tif如果我从终端运行它,它就像一个护身符。相反,如果我试图从一个简单的PHP文件执行它,它不会创建任何.tif文件。
<?php
$exec = "./convertpngtif.sh";
exec($exec);
?>发布于 2013-07-24 14:53:42
线索在上面的Hieu Nguyen答案中:当你用PHP -r从命令行运行时,它是有效的。当你在浏览器中运行时,它不会。这会导致三个可能的问题之一。
要记住的关键一点是,当您运行exec时,脚本、用户、路径和工作目录将以与PHP运行时相同的用户/权限运行。
当在命令行中运行PHP时,PHP将以您登录的用户身份( " you“)运行,因此exec()也将运行”you“。这也是您用来编写shell脚本的同一用户。因此,权限与您的权限相同,并且它可以工作(很好)。
当PHP在Apache (或IIS)中运行时,它可能是“您”,也可能不是。在您的例子中,显然不是因为脚本不起作用- PHP可能是以"apache“、"http”或"www“或其他类似名称的用户身份运行的。
这会导致三个可能的问题之一。那么,要检查的内容:
1)和2)路径和工作目录。
一次只建议一个,但更安全的做法是规定所有文件的绝对路径(即从根/开始的完整路径)-可执行命令、输入文件和输出文件。这排除了路径或工作目录中可能出现的任何差异。如果您使用shell脚本,请规定shell脚本的完整路径和其中的完整路径(或在顶部设置路径/目录)
3)权限
上面再次建议,但每个人都集中在文件上。但是您检查过convert可执行命令本身的权限吗?
另外,对于shell脚本,您是否已将其权限设置为运行PHP的用户的可执行文件?rwxr--r--由"you“拥有,如果您在apache中以不同的用户身份运行,则不能令人满意。
如果正在努力解决这些问题,还有一些其他的解决方案:
使用fastCGI
发布于 2013-07-15 20:57:07
考虑使用php imagick而不是exec函数。
发布于 2013-07-19 17:47:27
对我来说,这看起来像是许可问题。首先,你需要在终端上使用system()而不是exec()来调试你的php调用(以获得完整的输出):
php -r 'system("/opt/local/bin/convert -adaptive-resize 150% 1.png 1.tif");'我敢打赌,您将看到确切的错误。在我看来,有两种情况:
/opt/local/bin/convert没有执行权限,在这种情况下,您必须检查每个文件夹的权限,从/opt到/opt/local等,并至少为每个文件夹授予权限755。在这两种情况下,使用ls -la获取每个文件夹的权限。
希望这能有所帮助。
https://stackoverflow.com/questions/17654642
复制相似问题