Я знаю, что это старый вопрос, но, надеюсь, он все-таки окажется полезным для кого-то ...
Наличие управления процессами (fork / exec / wait / kill / signal и т. Д.) В PHP-скрипте под названиемнапрямую из Apache через http-запрос определенно не подходит.Как вы говорите, это очень быстро запутывается:)
Я бы предположил, что PHP-скрипт, вызываемый через http, является просто командным прокси для простого серверного процесса.Если PHP является вашим предпочтительным языком, вы можете реализовать оба этих способа.
Например, вы можете сделать это с очередями сообщений следующим образом ...
Вы можете создатьдовольно простой сервер PHP, который создает очередь сообщений и ожидает поступления сообщений. Затем он может выполнять работу по запуску или остановке процессов симулятора
Удаленный пользователь выбирает операцию (запуск, остановка, получение вывода) через форму веб-страницы.
Это приводит к тому, что запрос HTTP / POST отправляет данные формы в ваш PHP-скрипт (я бы сделал это как AJAX-вызовпоэтому я могу отправлять данные и интерпретировать результат без перезагрузки страницы)
Ваш серверный PHP-скрипт может интерпретировать данные формы и отправлять команду через сообщение процессу PHP-сервера.
Давайте проиллюстрируем это с помощью некоторого кода PHP.Я держу это тривиальным и неискушенным в интересах краткости.
PHP Script (цель веб-формы)
Здесь мы интерпретируем наш входящий запрос формы и переворачиваемэто в сообщение для серверного процесса
<?php
/*
* Responses are sent as simple text strings to be interpreted by
* the client-side JavaScript handling this AJAX call. Responses
* starting with 'ERR:' are errors, responses starting with 'ACK:'
* are acknowledgements. Simply check the first few characters of
* the response in the client-side JavaScript.
*/
header('Content-Type: text/plain; charset=UTF-8);
/*
* Here we define some message types, one per command. These should correspond
* to the command string sent from the web form
*/
$command = array(
'START_SIM' => 1,
'STOP_SIM' => 2,
'GET_STATUS' => 3,
'GET_OUTOUT' => 4
);
$queue_id = 0xbeef; /* An arbitrary message queue id */
$cmd = $_REQUEST['command']; /* The command from the web form */
/* get simulator instance id to act upon, if specified */
if (isset($_REQUEST['id']))
$sim_id = $_REQUEST['id'];
else
$sim_id = ''; /* no sim id? probably a create command */
/* check the message queue exists... */
if (msg_queue_exists($queue_id) === false) {
echo 'ERR:Message queue not found!';
return;
}
/* open the message queue and pass the command on to the server... */
if (($qhandle = msg_get_queue($queue_id)) === false) {
echo 'ERR:Failed to open message queue to server';
return;
}
if (msg_send($qhandle, $command[$cmd], $sim_id) === false)
echo 'ERR:Failed to send command';
else
echo 'ACK:Command sent ok';
?>
PHP Server (запускается отдельно на вашем веб-сервере)
А вот такой же простой сервер ...
<?php
/*
* assume the same queue id's and defines as in the
* client code above, etc..
*/
if (($qhandle = msg_get_queue($queue_id)) === false) {
/* emit failure message to log file etc.. */
...
return;
}
while (1) {
if (msg_receive($qhandle, 0, $msgtype, $message,
true, 0, $rc) === false) {
/* log error message ... */
} else {
/*
* Get the client id (in case you want to send
* a reply back to the client) and the
* message data, which is the simulation id.
*
* Remember that we use the message type to
* indicate the command being requested
*/
$client = $message['client'];
$sim_id = $message['msg'];
evaluate_command($client, $msgtype, $sim_id);
}
}
?>
Очевидно, что это ужасно просто, без проверки ошибок, и вам нужно будет написать функцию "valu_command () "самостоятельно.Я просто набросал это, чтобы проиллюстрировать идею (и я записал это с рук, так что оно может быть переполнено другими ошибками!)