【问题标题】:From php how the system() function is working?从 php system() 函数是如何工作的?
【发布时间】:2012-07-18 15:25:46
【问题描述】:

我正在一个项目中工作,脚本将在 Linux 下运行。它有许多用 C++ 编写的模块。我需要从 PHP 中调用这些模块。

我的问题如下:

  1. 我的模块是软件包中的模块之一。
  2. 我们的软件有 PHP 层来获取用户输入并将其存储在数据库中,并在需要时调用 C++ 引擎。
  3. 所有模块都在运行并使用一些由基本模块设置的环境变量。
  4. 有一层 PHP 通过我们将用户输入获取到我们的 C++ 引擎。
  5. 我需要从 PHP 调用一个应用程序 (abc.out),它将填充数据库。

问题是我必须在应用程序运行之前设置一个新的环境变量。

我正在使用getenv() 获取旧环境变量,然后将路径附加到它并再次设置。我已经使用putenv() 设置了新的环境变量。

设置环境变量后,我使用system() 从 PHP 调用该应用程序,它正在工作。

我怀疑这个环境变量更改是否会影响正在运行的其他模块。

有一件事是,如果我们使用system() 进行多个操作,我可以设置环境变量并从同一个system() 调用中调用我的应用程序。这里我怀疑这是否也会影响正在运行的其他应用程序,或者仅影响使用system() 调用的特定应用程序。

system() 是为每个程序创建一个新会话,我们称之为或不调用它?

谢谢

【问题讨论】:

    标签: php linux system


    【解决方案1】:

    嗯,php 是开源的 :-) 你需要查看文件ext/standard/exec.c。 system 被实现为对 php_exec_ex 的调用,它通过 php_exec 使用名为 VCWD_POPEN 的宏,在 Linux 系统上使用 popen() 系统调用。

    因此,在 Linux 系统上对 PHP system() 的每次调用都将通过新的 popen() 系统调用执行,所以是的,单独的调用是隔离的。我没有检查 Windows。

    【讨论】:

    • 感谢 fvu,正如你所说,每个 system() 都会创建一个不同/新鲜的环境,所以,如果我调用 putenv() 然后通过 system() 调用我的应用程序,那么它将在新的环境/会话,它不会影响其他应用程序的运行。如果它是正确的,那么我可以在我的模块中使用它。再次感谢..
    • 如果您对答案感到满意,可以请您接受吗?谢谢!
    • 我有一个疑问,我遇到了 shell_exec() 它也在做同样的事情,所以我的要求是我必须在不影响其他应用程序的情况下运行该应用程序,我该怎么做。使用 system() 或 shell_exec()
    • 在内部你会看到 shell_exec 也使用 VCWD_POPEN 所以它是相同的。因此,对于系统而言,同样的隔离概念也适用于 shell_exec - 查看源代码,您会发现这些函数彼此非常相关。我还在我的帖子中放置了 exec.c 的 git 源的链接,它应该可以回答您可能仍然存在的大多数问题。
    猜你喜欢
    • 2022-11-15
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多