Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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
用于转换图像的Php exec命令_Php_Macos_Permissions_Exec_Mamp - Fatal编程技术网

用于转换图像的Php exec命令

用于转换图像的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

我正在尝试使用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-自适应调整大小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'