如何在C中从apache CGI进程中分离独立的PHP进程?

如何在C中从apache CGI进程中分离独立的PHP进程?,php,c,apache,cgi,Php,C,Apache,Cgi,基本上,我有一个用C编写的CGI模块,我想分离一个完全独立的PHP进程。PHP进程与CGI无关,只是后者通过命令行将参数传递给前者。一旦分离发生,这两个进程就不再相互关联,而是异步完成。两者都独立访问数据库并执行不相关的功能。原始流程不等待分离的流程,也不关心它是否完成、是否成功。两个进程都在执行其特定功能后终止。分离的进程显式设置文件路径,因此原始进程的默认目录不相关。假设要启动的命令是php.exe arg1 arg2 在Windows下,您可以使用函数CreateProcess在cgi中创

基本上,我有一个用C编写的CGI模块,我想分离一个完全独立的PHP进程。PHP进程与CGI无关,只是后者通过命令行将参数传递给前者。一旦分离发生,这两个进程就不再相互关联,而是异步完成。两者都独立访问数据库并执行不相关的功能。原始流程不等待分离的流程,也不关心它是否完成、是否成功。两个进程都在执行其特定功能后终止。分离的进程显式设置文件路径,因此原始进程的默认目录不相关。

假设要启动的命令是php.exe arg1 arg2

在Windows下,您可以使用函数CreateProcess在cgi中创建分离的进程:

STARTUPINFO si;
PROCESS_INFORMATION pi;

memset(&si, 0, sizeof(si));
si.cb = sizeof(si);
if (!CreateProcess(NULL, // name of executable module
        "php.exe ag1 arg2", // command line string
        NULL, // SD
        NULL, // SD
        FALSE, // handle inheritance option
        CREATE_NEW_CONSOLE, // creation flags
        NULL, // new environment block
        NULL, // current directory name
        &si, // startup information
        &pi // process information))
{
    logError();
}
在Linux或其他类似Unix的操作系统下,您可以与execvp配合使用fork函数:

int pid = fork();
if (pid < 0)
{
    logError();
}
else if (pid == 0) // Child Process
{
    char *args[] = { "php.exe", "arg1, "arg2", NULL };
    exevp(args[0], args);
    logError(); // should never reach this line
}

要在Linux下对进程进行后台监控,您需要fork/exec两次。谢谢您的回复。但是,linux代码不能按原样工作。经过实验后,我发现只有删除.exe文件,它才能工作。它必须是php。此外,第一个参数必须是要运行的php文件。php模块的参数紧随其后。因此,起作用的参数是char*args[]={php,/var/www/html/mail_new_cc_invoices.php,sales_id,NULL};你的回答足够让我走了。我知道要使用哪些函数,文档告诉我从哪里开始。很抱歉在两年半后重新使用这个函数,但是我在使用不同的分离过程时遇到了困难。它似乎不是真正独立的。当它运行时,忙碌指示灯继续显示在屏幕上。有时分离的过程没有结束,没有明显的原因。我怀疑用户移动到了另一个屏幕并将其杀死。