2015-02-18 3 views
0

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

+0

Для демонстрации процесса под Linux вам необходимо выполнить fork/exec дважды. – alk

ответ

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 подобных ОС, вы можете использовать функцию вилку в координации с 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}; Твой ответ был достаточно, чтобы заставить меня идти. Я знал, какие функции использовать, и документация сообщила мне, куда идти оттуда. – user157426

+0

Извините, что воскресил этот два с половиной года спустя, но у меня возникают трудности с другим отдельным процессом. Он не кажется действительно независимым. Когда он работает, индикатор «занят» продолжает отображаться на экране. И иногда отдельный процесс не заканчивается, без видимых причин. Я подозреваю, что пользователь перешел на другой экран и убил его. – user157426

Смежные вопросы