gpt4 book ai didi

php - 从 C 程序执行 php 脚本并将结果存储到变量中

转载 作者:可可西里 更新时间:2023-10-31 23:52:53 26 4
gpt4 key购买 nike

我想从 C 程序执行 PHP 脚本并将返回的内容存储到 C 变量中。

我试过如下但它不起作用:

C:

printf("calling php function\n");
execl("/usr/bin/php -q", "/var/www/html/phpinfo.php", NULL);
printf("End php function\n");

PHP:

<?php
echo "hello";
?>

环境:

  • PHP 5.2.6
  • Apache 2.0
  • Fedora Core 10

同时建议任何其他更好的方法。

最佳答案

这里的简短回答是使用 system()popen() 而不是 execl()。鉴于 Jason 已经发布了关于使用 popen() 的一个很好的答案,我将跳过它并解释如何使用 execl() 以防万一你真的关心。最有可能的是,这些都是不必要的技术废话——但是该死的,在讨论 popen() 之前,我已经把其中的大部分打出来作为一个很长的序曲,我现在不会扔掉它!

首先……

调用 execl() 时,所有命令行参数都需要单独传递。此外,第一个参数必须重复,因为在任何程序的 main() 中,argv[0] 通常是程序的名称。所以固定电话应该是这样的:

execl("/usr/bin/php", "/usr/bin/php", "-q",
"/var/www/html/phpinfo.php", (char *) NULL);

(我将强制转换添加到 (char *) 以确保将空指针作为最终参数而不是整数 0 传递,如果 NULL 恰好是定义为 0 而不是 (void *) 0,这是合法的。)

然而...

这使 execl() 调用正确,但还有一个更大的问题。 exec 系列函数几乎总是与 fork() 和一些复杂的 pipe() 结合使用。这是因为 exec 函数不在单独的进程中运行程序;他们实际上取代了当前的流程!因此,一旦您调用 execl(),您的代码就完成了。完成的。 execl() 永远不会返回。如果您只是像之前那样调用它,您将永远看不到会发生什么,因为您的程序会神奇地转变为 /usr/bin/php 进程。

好的,那 fork()pipe() 是怎么回事?在高层次上,您要做的是将您的流程分成两个流程。父进程将继续是“您的”进程,而子进程将立即调用execl() 并将自身转变为/usr/bin/php。然后,如果您已将父进程和子进程正确连接在一起,它们将能够相互通信。

长话短说,如果您还在这里并且没有打瞌睡,您应该咨询明智的 oracle Google 以获取有关所有这些的更多详细信息。有很多网站提供了更多(!)关于如何执行 fork/exec 舞蹈的深入细节。

不过我不会让你悬着的。这是我在自己的程序中使用的一个函数,它完全符合我概述的内容。它实际上与 popen() 非常相似,唯一的区别是除了 stdin标准输出

代码...

#include <errno.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

pid_t execute(const char *command, FILE **in, FILE **out, FILE **err)
{
pid_t pid;
int fd[6];

pipe(&fd[0]);
pipe(&fd[2]);
pipe(&fd[4]);

switch (pid = fork()) {
case -1:
perror("unable to fork()");
exit(1);

case 0:
close(fd[1]); // Close write end of stdin.
close(fd[2]); // Close read end of stdout.
close(fd[4]); // Close read end of stderr.

dup2(fd[0], STDIN_FILENO); // Have stdin read from the first pipe.
dup2(fd[3], STDOUT_FILENO); // Have stdout write to the second pipe.
dup2(fd[5], STDERR_FILENO); // Have stderr write to the third pipe.

execlp("/bin/sh", "/bin/sh", "-c", command, (char *) NULL);

perror("execlp() failed");
_exit(1);

default:
close(fd[0]); // Close read end of stdin.
close(fd[3]); // Close write end of stdout.
close(fd[5]); // Close write end of stderr.

if (in) *in = fdopen(fd[1], "wb"); else close(fd[1]);
if (out) *out = fdopen(fd[2], "rb"); else close(fd[2]);
if (err) *err = fdopen(fd[4], "rb"); else close(fd[4]);

return pid;
}
}

关于php - 从 C 程序执行 php 脚本并将结果存储到变量中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1047385/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com