В основном у меня есть модуль 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
}