По сути, у меня есть модуль CGI, написанный на C, и я хочу отделить полностью независимый процесс 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-подобной ОС вы можете использовать функцию fork совместно с execvp:
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
}
Других решений пока нет …