2013-07-15 48 views
3

我试图使用imagemagick命令“转换”从.png创建一个.tif图像。Php执行命令转换图像

什么,我跟是:

$exec = "/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif"; 
exec($exec); 

如果我碰上CLI“其将”我得到的路径:/opt/local/bin/convert。我也试过没有路径,只有/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); 
?> 
+0

执行var_dump($ exec)查看生成的内容,可能是空格问题 – JorgeeFG

+0

string(56)“/ opt/local/bin/convert -adaptive-resize 150%1.png 1.tif“ – KingBOB

+0

试试这些:'error_reporting(E_ALL);后续代码var_dump($ _ SERVER); echo getcwd();',也看看apache的error.log。 –

回答

5

线索在Hieu Nguyen的回答如上:当你从命令行运行PHP -r时,它的工作原理。当你在浏览器中运行时,它不会。这导致三个可能的问题之一。

要记住的关键是,当您运行exec时,脚本,用户,路径和工作目录将以与运行PHP相同的用户/权限运行。

在命令行中运行PHP时,PHP将以用户身份(“你”)登录,因此exec()也会运行“你”。这也将是您用来编写shell脚本的用户。因此,权限与您的权限相同,并且工作正常(很好)。

当PHP在Apache(或IIS)中运行时,可能是也可能不是“你”。在你的情况下,它显然不是脚本不工作 - PHP可能运行为“apache”或“http”或“www”或一些类似命名的用户。

这导致三个可能的问题之一。那么检查什么:

1)和2)路径和工作目录。

以上建议一次,但对所有文件(可执行命令,输入文件和输出文件)规定绝对路径(即全路径,从根/开始)比较安全。这排除了可能出现的路径或工作目录中的任何差异。如果你使用的shell脚本,规定其内完整路径shell脚本和完整路径(或设置路径/顶部目录)

3)权限

上述同样的建议,但大家都在专注于文件。但是你有没有检查convert可执行命令本身的权限?

同样在shell脚本中,您是否将用户的权限设置为用户PHP的可执行文件? rwxr - r--属于“你”,如果你是以apache内的不同用户身份运行,那么它是不令人满意的。

有几个其他的解决方案,如果与挣扎:

  1. 你可以让PHP运行为“你”,甚至在Apache中使用FastCGI安装。这样你就知道你正在运行两个PHP脚本的用户/路径/工作目录。 (我仍然推荐完整路径,但仍然缓解许可问题)

  2. 您可以通过以“apache”或“www”或“http”等登录并设置权限/路径来调试脚本,以便您的脚本现在作品。

+0

+1以获得很好的解释 – beerwin

1

就我所见,您正在尝试使用ImageMagick来转换图像。

PHP有一个Imagick库需要安装。如果你有root权限,你可以轻松做到这一点,并使用imagick库包装函数来转换图像(无需运行命令行)。

Here is the documentation to php Imagick

你可以用phpinfo();检查是否安装imagick。

+1

'Imagick'不过是一个包装围绕可执行文件,OPs问题应该坚持...... –

+0

它不是可执行文件的包装。如果你阅读Imagick的源代码(你可以,因为它是开源的),你会看到。 (https://github.com/mkoppanen/imagick/) – griffin

0

看看你是否有正确的写入权限。

在为Apache服务器的Linux常见的用户名是www数据

在控制台:

cd /var/www (or where you are saving your php files) 
ls -la (You will see permissions) 
sudo chown www-data:youruser thisfolder (change primary user to www-data and group to youruser) 
sudo chmod 775 thisfilder (change permissions, write read exec for user and usergroup and read for others. 
+0

所以,如果我的用户名是乔治。我会输入: sudo chown www-data:Giorgio thisfolder?我试图输入路径而不是“thisfolder”。但我得到这个错误:乔治:无效的论点。 – KingBOB

+0

在控制台中写下'groups'或'groups giorgio'来查看你的gid信息。 http://stackoverflow.com/questions/350141/in-unix-linux-how-to-you-find-out-what-group-a-given-user-is-in-via-command-line – JorgeeFG

+0

对不起,如果我再次问乔治。当我键入组时,我会看到“staff com.apple.sharepoint.group.1 _lpadmin _appserveradm _appserverusr admin”。我现在应该怎么做? – KingBOB

1

这看起来像一个权限问题给我。首先,你需要使用system()代替exec()调试你的PHP调用(获得完整的输出)端子上:

php -r 'system("/opt/local/bin/convert -adaptive-resize 150% 1.png 1.tif");' 

我敢打赌,然后你会看到确切的错误。有2例在我看来:

  • 的目标文件夹没有写权限,在这种情况下,您可能希望该文件夹的权限更改为777

  • /opt/local/bin/convert没有执行权限,在这种情况下,您必须检查从/opt/opt/local等的每个文件夹权限,并给予他们每个人至少755的权限。

在这两种情况下,都使用ls -la来获取每个文件夹的权限。

希望这会有所帮助。

+0

当我运行这个命令时,一切都按预期工作,并且tif文件被建造。它给了我没有错误。 – KingBOB

2

我会为此使用PHP imagemagick的界面。事情是这样的:

<?php 
$image = new Imagick("image.png"); 
$height=$image->getImageHeight()*1.5; // 150% size 
$width=$image->getImageWidth()*1.5; // 150% size 
$image->resizeImage($width, $height, imagick::FILTER_LANCZOS, 1); 
$image->setImageFormat("tif"); 
$image->writeImage("image.tif"); 
$image->clear(); 
$image->destroy(); 
?> 
0

如何使用临时目标文件

$source = dirname(__FILE__) . '/' . $pos.".png"; 
$target = tempnam('/tmp/', 'tif-'); 
rename($target, $target . '.tif'); 
$target .= '.tif'; 

$command = '/opt/local/bin/convert'; 

assert(file_exists($command)); 
assert(file_exists($source)); 
assert(is_readable($source)); 
assert(! file_exists($target)); 

$exec = $command . " -adaptive-resize 150% ". escapeshellarg($source) . " " . escapeshellarg($target); 
exec($exec); 
1

你也可以尝试像这样在PHP执行shell脚本:

<?php echo shell_exec('sh ./convertpngtif.sh'); ?> 

<?php 
$exec = file_get_contents("./convertpngtif.sh"); 
echo shell_exec($exec); 
?> 
1

我会先打印错误消息诊断错误:

$out, $ret; 
$exec = "/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tif 2>&1"; 
exec($exec, $out, $ret); 
var_dump($out); 

这是非常可能的ImageMagick的停止从EXEC()运行,即使它运行正常,从CLI,因为权限问题正如其他人所说的那样。

2

这个答案可以在Linux/MAC

我知道这是一个老问题 - 但我也有类似的问题。 一个无需路径问题,执行shell命令的方法是 创建一个新的登录shell 使用

/bin/bash -l 

所以庆典充当像是一个登录shell和所有PATHINFO设置。 使用-c添加的命令为字符串

$exec = "/bin/bash -lc 'convert -adaptive-resize 150% ".$pos.".png".$pos.".tif'"; 
exec($exec,$out,$rcode); 

你可以用它来获取路径由

/bin/bash -lc 'which convert' 

和工作转换不bash的一部分

它仍然要求转换的权限被设置,并且允许用户php运行的 登录。 因此,必须设置/ etc/passwd(ubuntu/debian)中的登录shell