【问题标题】:PHP system calls and $PATH in OS XOS X 中的 PHP 系统调用和 $PATH
【发布时间】:2011-03-26 19:14:44
【问题描述】:

我正在尝试让 PHP 在 OS X 上进行系统调用。但是,它似乎无法找到系统路径中包含的任何内容。

当我跑步时...

putenv("PATH={$_SERVER["PATH"]}:/usr/local/bin");

...就在系统调用之前,它可以工作。这不是一个实际的解决方案,因为执行系统调用的代码是一个插件,所以我宁愿不接触会使其不兼容的源代码来更新。

Apache2 以与我登录时相同的用户身份运行,因此理论上它可以访问与我相同的命令。

此外,相同的代码在我的 Ubuntu 机器上也能正常工作。

【问题讨论】:

  • getenv("PATH") 说什么?可能 Mac OS 上没有为 PHP/Apache 用户设置路径?
  • 好吧,运行 , 输出 /usr/bin:/bin:/usr/sbin:/sbin、(我的用户)和 /usr/bin:/bin:/usr/sbin:/sbin。从控制台运行“echo $PATH”作为 apache 用户输出 /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/opt/X11/bin:/usr/local/git /bin:/usr/X11/bin

标签: php macos path system-calls


【解决方案1】:

Mac OS X 上的环境变量由不同的机制设置,具体取决于您的代码或其父进程的启动方式。为了确保从交互式 shell 启动的项目和 WindowServer 启动的项目具有相同的路径,您需要使 ~/.MacOSX/environment.plist 与 .profile(或 .cshrc)中设置的内容保持同步。

无需求助于编辑环境即可实现目标的最简单方法是通过系统命令为您正在执行的内容指定一个临时路径。例如:

char cmdStr[512] = "PATH=$PATH:/usr/local/bin";
strncat(cmdStr,"MyCommand", 9);
system(cmdStr);

这样环境只会影响 MyCommand 的上下文并在之后恢复。

【讨论】:

  • 谢谢!由于我的用户不存在 environment.plist(可能是问题),我可以简单地将其软链接到 .profile 吗?使用 PHP hack 并不是一个真正的选择,因为有问题的系统调用位于插件中。
  • 不,这行不通。这些文件有不同的格式,需要有不同的内容。见developer.apple.com/library/mac/#qa/qa2001/qa1067.html
猜你喜欢
  • 2012-07-16
  • 2016-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-28
  • 2015-09-11
  • 2014-12-20
相关资源
最近更新 更多