4

我正在尝试使用 imagemagick 命令“转换”从 .png 图像创建 .tif 图像。

我带来的是:

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

如果我遇到 CLI “which convert” 我会得到那个路径:/opt/local/bin/convert. 我也试过没有路径,只有/opt/local/bin/convert -adaptive-resize 150% ".$pos.".png ".$pos.".tifand /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);
?>
4

10 回答 10

8

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

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

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

当 PHP 在 Apache(或 IIS)中运行时,它可能是也可能不是“你”。在您的情况下,这显然不是因为脚本不起作用 - PHP 可能以“apache”或“http”或“www”或类似名称的用户身份运行。

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

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

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

3) 权限

上面再次建议,但每个人都专注于文件。但是您检查过convert可执行命令本身的权限吗?

同样使用 shell 脚本,您是否将其权限设置为 PHP 正在运行的用户的可执行文件?rwxr--r-- 如果您在 apache 中以不同用户身份运行,则“您”拥有的 rwxr--r- 并不令人满意。

如果遇到这些问题,还有其他几个解决方案:

  1. 即使在 Apache 中使用 fastCGI 安装,您也可以让 PHP 以“您”的身份运行。这样,您就知道运行两个 PHP 脚本的用户/路径/工作目录。(我仍然推荐完整路径,但仍然可以缓解权限问题)

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

于 2013-07-24T06:53:42.443 回答
2

考虑使用php imagick而不是exec函数。

于 2013-07-15T12:57:06.513 回答
2

这对我来说似乎是一个权限问题。首先,您需要在终端上使用system()而不是exec()(以获取完整输出)来调试您的 php 调用:

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

我敢打赌,你会看到确切的错误。我认为有两种情况:

  • 目标文件夹没有写入权限,在这种情况下,您可能需要将该文件夹的权限更改为 777。

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

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

希望这可以帮助。

于 2013-07-19T09:47:26.783 回答
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(); 
?>
于 2013-07-19T10:21:05.510 回答
2

此答案适用于 LINUX/MAC

我知道这是一个老问题 - 但我有一个类似的问题。一种在没有路径问题的情况下执行 shell 命令的方法是创建一个新的登录 shell 使用

/bin/bash -l 

所以 bash 就像它是一个登录 shell 并且所有路径信息都已设置。使用 -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

于 2016-01-11T10:22:45.287 回答
1

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

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

这是 php Imagick 的文档

您可以检查phpinfo();是否安装了 imagick。

于 2013-07-15T12:57:22.377 回答
1

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

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

或者

<?php
$exec = file_get_contents("./convertpngtif.sh");
echo shell_exec($exec);
?>
于 2013-07-23T11:16:53.470 回答
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 正常运行也是如此。

于 2013-07-24T07:46:35.310 回答
1

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

在 Linux 中,Apache 服务器的常用用户名是 www-data

在控制台中:

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.
于 2013-07-15T13:01:23.540 回答
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 );
于 2013-07-19T22:42:17.517 回答