Как отсоединить независимый процесс PHP от процесса Cache Apache в C?

0

В основном у меня есть модуль CGI, написанный на C, и я хочу отделить полностью независимый процесс PHP. Процесс PHP не имеет никакого отношения к CGI, кроме того, что последний передает параметр первому через командную строку. Когда происходит отсоединение, два процесса не имеют ничего общего друг с другом и завершают асинхронно. Оба доступа к базе данных независимо и выполняют несвязанные функции. Первоначальный процесс не ждет отсоединенного процесса и не заботится о том, закончится ли он, успешна или нет. Оба процесса завершаются после выполнения своих конкретных функций. Отключенный процесс явно устанавливает пути к файлам, поэтому каталог исходного кода по умолчанию не имеет значения.

  • 0
    Чтобы демонизировать процесс в Linux, вам нужно дважды выполнить команду fork / exec.
Теги:
cgi

1 ответ

0

Предположим, что командой для запуска является "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
}
  • 0
    Спасибо за ответ. Тем не менее, код Linux не работает как есть. После экспериментов я обнаружил, что это не будет работать, пока я не удалил «.exe». Это должен быть просто "php". Кроме того, первым параметром должен быть файл php для запуска. Параметры этого модуля php следуют после этого. Поэтому сработали следующие параметры: char * args [] = {"php", "/var/www/html/mail_new_cc_invoices.php", sales_id, NULL}; Твоего ответа было достаточно, чтобы заставить меня идти. Я знал, какие функции использовать, и в документации говорилось, куда идти дальше.
  • 0
    Извините, что воскресил это два с половиной года спустя, но у меня возникли трудности с другим отдельным процессом. Похоже, он не является действительно независимым. Когда он работает, индикатор «занят» продолжает отображаться на экране. И иногда отстраненный процесс не заканчивается без видимой причины. Я подозреваю, что пользователь перешел на другой экран и убил его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню