用于转换图像的Php exec命令
我正在尝试使用imagemagick命令“convert”从.png图像创建.tif图像 我带来的是:用于转换图像的Php exec命令,php,macos,permissions,exec,mamp,Php,Macos,Permissions,Exec,Mamp,我正在尝试使用imagemagick命令“convert”从.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-自适应调整大小15
$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-自适应调整大小150%“$pos.”.png“$pos.”.tif
和/etc/local/bin/convert-自适应调整大小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);
?>
考虑使用而不是exec函数。据我所知,您正在尝试使用ImageMagick转换图像 PHP有一个需要安装的
Imagick
库。如果您具有根访问权限,则可以轻松地执行此操作,并使用imagick库包装函数转换图像(无需运行命令行)
您可以使用
phpinfo()进行检查代码>如果安装了imagick。查看您是否具有正确的写入权限
在linux中,Apache服务器的通用用户名是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.
对我来说,这似乎是一个许可问题。首先,您需要在终端上使用system()
而不是exec()
(以获得完整输出)调试php调用:
php -r 'system("/opt/local/bin/convert -adaptive-resize 150% 1.png 1.tif");'
我打赌你会看到确切的错误。我认为有两种情况:
- 目标文件夹没有写入权限,在这种情况下,您可能希望将该文件夹的权限更改为777
/opt/local/bin/convert
没有执行权限,在这种情况下,您必须检查从/opt
到/opt/local
等的每个文件夹权限,并至少授予每个文件夹755权限
在这两种情况下,使用ls-la
获取每个文件夹的权限
希望这有帮助。我会使用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();
?>
使用临时目标文件如何:
$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 );
您也可以这样尝试在PHP中执行shell脚本:
<?php echo shell_exec('sh ./convertpngtif.sh'); ?>
或
上面的Hieu Nguyen回答中给出了线索:当您使用PHP-r从命令行运行时,它会工作。当您在浏览器中运行时,它不会。这导致了三个可能的问题之一
需要记住的一点是,当您运行exec时,脚本、用户、路径和工作目录将以与PHP运行时相同的用户/权限运行
在命令行中运行PHP时,PHP将以用户身份(“您”)运行,因此exec()也将运行“您”。这也是您用来编写shell脚本的用户。因此,权限与您的权限相同,并且非常有效
当PHP在Apache(或IIS)中运行时,它可能是也可能不是“您”。在您的例子中,这显然不是因为脚本不起作用——PHP可能以“apache”或“http”或“www”或类似名称的用户的身份运行
这导致了三个可能的问题之一。那么要检查什么:
1) 路径和工作目录
建议一次一个,但更安全的做法是规定所有文件的绝对路径(即从根/
开始的完整路径),包括可执行命令、输入文件和输出文件。这排除了路径或工作目录中可能出现的任何差异。如果使用shell脚本,请指定shell脚本的完整路径及其内部的完整路径(或在顶部设置路径/目录)
3) 权限
上面再次提到,但每个人都在关注这些文件。但是您是否检查了convert
可执行命令本身的权限
另外,对于shell脚本,您是否为运行PHP的用户将其权限设置为可执行?如果您是以不同于apache的用户身份运行,那么“you”拥有的rwxr--r--就不能令人满意
如果要解决这些问题,还有一些其他解决方案:
即使在Apache中,您也可以使用fastCGI安装使PHP以“您”的身份运行。这样,您就知道运行这两个PHP脚本的用户/路径/工作目录。(我仍然建议使用完整路径,但仍然可以缓解权限问题)
您可以通过以“apache”或“www”或“http”等身份登录并设置权限/路径来调试脚本,这样您的脚本现在就可以工作了
我会先打印错误消息来诊断错误:
$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正常运行。这个答案在LINUX/MAC上有效。
我知道这是一个老问题,但我有一个类似的问题。
执行shell命令而不存在路径问题的一种方法是
创建一个新的登录shell
使用
所以bash就像是一个登录shell,所有的pathinfo都设置好了。
使用-c将命令添加为字符串
$exec = "/bin/bash -lc 'convert -adaptive-resize 150% ".$pos.".png".$pos.".tif'";
exec($exec,$out,$rcode);
您可以使用它来获取要转换的路径
/bin/bash -lc 'which convert'
在没有重击的情况下工作
仍然需要设置转换权限,并且
允许运行php的用户登录。
因此,必须设置/etc/passwd(ubuntu/debian)中的登录shell执行var_dump($exec)以查看生成的内容,spacesstring(56)可能有问题“/opt/local/bin/convert-adaptive resize 150%1.png 1.tif”尝试这些:错误报告(E_ALL);变量转储($\服务器);echo getcwd()代码>,还可以查看apache的error.log.1.png是否具有用户www数据的读取权限?甚至在目录中有写权限?(用于肌酸)
$exec = "/bin/bash -lc 'convert -adaptive-resize 150% ".$pos.".png".$pos.".tif'";
exec($exec,$out,$rcode);
/bin/bash -lc 'which convert'