首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于转换图像的Php exec命令

用于转换图像的Php exec命令
EN

Stack Overflow用户
提问于 2013-07-15 20:47:53
回答 10查看 10.3K关注 0票数 4

我正在尝试使用imagemagick命令"convert“从.png镜像创建.tif镜像。

我带来的是:

代码语言:javascript
复制
$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文件,但没有成功:

代码语言:javascript
复制
#! /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文件。

代码语言:javascript
复制
<?php
$exec = "./convertpngtif.sh";
exec($exec);
?>
EN

回答 10

Stack Overflow用户

回答已采纳

发布于 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

  • ,你甚至可以让在Apache中以“你”的身份运行。这样,您就知道了运行这两个PHP脚本的用户/路径/工作目录。(我仍然建议使用完整路径,但仍然可以缓解权限问题)
  1. 您可以通过以"apache“、"www”或"http“等身份登录并设置权限/路径以使脚本正常工作来调试脚本。
票数 8
EN

Stack Overflow用户

发布于 2013-07-15 20:57:07

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

票数 2
EN

Stack Overflow用户

发布于 2013-07-19 17:47:27

对我来说,这看起来像是许可问题。首先,你需要在终端上使用system()而不是exec()来调试你的php调用(以获得完整的输出):

代码语言:javascript
复制
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获取每个文件夹的权限。

希望这能有所帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17654642

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档