PHP C # именованные каналы

Недавно я задал вопрос об IPC между C # и PHP и последовал за ответом, предложив именованные каналы. Для этого я искал в Интернете подходящий пример именованных каналов, используя исключительно C # как client а также server одновременно и изменил его так, чтобы он работал асинхронно:

static void Main(string[] args)
{
Start();
new AutoResetEvent(false).WaitOne();
}

private static async void Start()
{
StartServer();
Thread.Sleep(1500);
StartClient();
}

private static async void StartClient()
{
var client = new NamedPipeClientStream("TestPipe");
await client.ConnectAsync();

var reader = new StreamReader(client);
var writer = new StreamWriter(client);
while (true)
{
var input = Console.ReadLine();
if (string.IsNullOrEmpty(input)) break;
await writer.WriteLineAsync(input);
await writer.FlushAsync();
Console.WriteLine(await reader.ReadLineAsync());
}
}

private static async void StartServer()
{
await Task.Run(async() =>
{
var server = new NamedPipeServerStream("TestPipe");
await server.WaitForConnectionAsync();
var reader = new StreamReader(server);
var writer = new StreamWriter(server);
while(true) // should be !reader.EndOfStream(), doesn't work tho
{
var line = await reader.ReadLineAsync();
await writer.WriteLineAsync("RECEIVED > " + line);
await writer.FlushAsync();
}
});
}

Так что, если я сейчас наберу Hello в консоль, она собирается вернуться RECEIVED > Hello, что хорошо и выглядит, как блестяще работает. Я полностью понимаю это в C #. Однако это меняется, когда в игру вступает PHP: я нашел менее хорошие примеры (или даже учебные пособия) для именованных каналов в PHP и их использования. Теперь, что я нашел Вот принес мне еще один шаг вперед, но только один.

В PHP мне, кажется, не хватает понимания всего комплекса. Моя цель — «кормить» мой сервер C # задачами в форме команд (например, create document id=12). Сервер (который также работает в основном асинхронно) затем должен что-то вернуть, указав, сработал он или нет (также используя id). Так, например, ответ моего сервера может быть:

document id=12 created successfully

или же

document id=12 error

Конечно, мне понадобятся оба моих приложения, чтобы проанализировать это и обработать эти ответы дальше, однако на данном этапе это не главное. Мне нужно мое PHP-приложение, чтобы планировать задачи на C # и получить «ответный сигнал» (можно сказать, «ошибка или нет»). Мне даже не нужны множественные обратные вызовы, поэтому, например, обновление статуса приложения C #, часто отправляющее это, мне нужно только одно последнее утверждение, сработало ли это или нет.

Взгляните на пример, который я нашел на php.net, это не говорит мне слишком много об этом:

<?php
$pipe="/tmp/pipe";
$mode=0600;
if(!file_exists($pipe)) {
// create the pipe
umask(0);
posix_mkfifo($pipe,$mode);
}
$f = fopen($pipe,"w");
fwrite($f,"hello");  //block until there is a reader
unlink($pipe); //delete pipe

?>

И это неблокирующий читатель:

<?php
$pipe="/tmp/pipe";
if(!file_exists($pipe)) {
echo "I am not blocked!";
}
else {
//block and read from the pipe
$f = fopen($pipe,"r");
echo fread($f,10);
}
?>

Первый вариант блокировки не подходит для Windows, поскольку posix недоступно в Windows, и мое приложение C # требует этого. В примере показан заблокированный канал (что это вообще такое? Я мог бы подумать о существующем канале, который считается заблокированным, поскольку if(!file_exists($pipe)) предполагает это). Однако это означало бы, что я мог обрабатывать только одну задачу одновременно с моим сервером C #, что не является обязательным требованием.

Это процедура, которая должна быть:

  1. Пользователь нажимает «скачать»
  2. PHP Action запущен (внутри моего Laravel Controller)
  3. PHP планирует задачу на сервер C # через канал
  4. C # сервер получает и обрабатывает его
  5. C # сервер завершает его и сообщает PHP, что он завершен (или выдается ошибка, соответственно) через канал
  6. PHP (Laravel Controller) уже ждет этого ответа и передает его пользователю

Я застрял в точке, где каналы могут быть заблокированы, поскольку это (в соответствии со ссылкой в ​​разделе комментариев к странице документации PHP) будет означать, что определенный канал заблокирован, и я хочу, чтобы несколько задач выполнялись одновременно, Мне нужно создать новый, о котором должен знать и мой сервер C #, что в заключение означает, что я могу установить только очень ограниченное число каналов, так сказать, «возможные» слоты для «работы» или «задач» сервер, к которому пользователь веб-приложения может присоединиться в [слот], и после этого слот очищается. Как бы то ни было, это разрушило бы концепцию моего асинхронного сервера на C # и основную идею, стоящую за ним, и я не могу думать об этом как об единственном решении.

Я с нетерпением жду некоторых предложений. Ура!

1

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]