如何在C中从apache CGI进程中分离独立的PHP进程?
基本上,我有一个用C编写的CGI模块,我想分离一个完全独立的PHP进程。PHP进程与CGI无关,只是后者通过命令行将参数传递给前者。一旦分离发生,这两个进程就不再相互关联,而是异步完成。两者都独立访问数据库并执行不相关的功能。原始流程不等待分离的流程,也不关心它是否完成、是否成功。两个进程都在执行其特定功能后终止。分离的进程显式设置文件路径,因此原始进程的默认目录不相关。假设要启动的命令是php.exe arg1 arg2 在Windows下,您可以使用函数CreateProcess在cgi中创建分离的进程:如何在C中从apache CGI进程中分离独立的PHP进程?,php,c,apache,cgi,Php,C,Apache,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};你的回答足够让我走了。我知道要使用哪些函数,文档告诉我从哪里开始。很抱歉在两年半后重新使用这个函数,但是我在使用不同的分离过程时遇到了困难。它似乎不是真正独立的。当它运行时,忙碌指示灯继续显示在屏幕上。有时分离的过程没有结束,没有明显的原因。我怀疑用户移动到了另一个屏幕并将其杀死。