【问题标题】:PHP exec() call never runsPHP exec() 调用从不运行
【发布时间】:2011-01-07 21:16:10
【问题描述】:

我认为这是一个权限问题,但不知道如何解决。

我有一个 php 脚本 -- mainscript.php -- 调用:

$scriptCall = "/usr/bin/php wrap_prep.php 2>&1 &";

运行 mainscript.php 时,wrap_prep.php 永远不会执行。但是,当我以 root 身份登录我的网络服务器并运行 php wrap_prep.php 2>&1 & 时,它工作正常。

我已将两个脚本设置为所有者和组到我的 apache 用户以及 755 权限。

我最近重新编译了 PHP 以添加一个库(不确定这是否与新问题有关)。

【问题讨论】:

  • wrap_prep.php 是否与 mainscript.php 位于同一目录中?否则,您可能必须添加绝对或相对路径。您的 apache error_log 中是否有类似“找不到文件”之类的内容?
  • 您是否尝试在后台运行 wrap_prep.php?
  • Thilo - 同一个目录,是的。彼得 - 是的。
  • 我在最初的帖子中取消了 exec 调用:exec( $scriptCall );

标签: php permissions exec


【解决方案1】:

首先,您应该简单地输出命令给您的exec() 的内容。无论如何都应该有错误消息。

其次,您在 PHP 脚本中这一事实并不一定意味着运行 PHP 的用户可以在/usr/bin/php 调用 PHP 二进制文件。你可以尝试改变它的权利吗?

如果这没有帮助,请检查您的 PHP 脚本正在运行的用户是否准确。据我所知,posix_getuid() 是找出这一点的最准确工具。确保您设置的权限与您为其设置权限的用户完全相同。

哦,Thilo 上面的评论是最明显的,应该先检查一下 :)

【讨论】:

  • 感谢您的回复。我尝试回显 exec 的结果。它返回一个空字符串。尝试 posix_getuid()... 看起来可能是个问题。当我从 ssh 运行时,我的 UID 是 root 或用户名。但是当我从我的网络浏览器调用它时,UID 是 99。也许这就是问题所在。
  • 你能查出哪个用户的 UID 为 99 吗?
  • 使用 posix_getpwuid(99) 我得到: Array ( [name] => nobody [passwd] => [uid] => 99 [gid] => 99 [gecos] => 没人 [dir] => / [shell] => /sbin/nologin ) 99
  • 你可以通过 exec 执行任何其他命令(例如 ls),你会得到任何输出吗?
  • 是的 - ls 返回返回值中的最后一个条目以及我的 $output 数组已填充(网络服务器和网络浏览器调用)。
【解决方案2】:

我会检查以确保您的主机没有完全禁用exec。我相信phpinfo() 会告诉你是不是。

【讨论】:

  • 没有禁用的功能或安全模式。不过谢谢。
【解决方案3】:

如果在 Windows 上运行(我知道 OP 不是),则可能需要将整个命令包含在一组引号中。

这是解释here

【讨论】:

    猜你喜欢
    • 2013-01-31
    • 2012-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2018-06-21
    相关资源
    最近更新 更多