Недавно я задал вопрос об 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 #, что не является обязательным требованием.
Это процедура, которая должна быть:
Laravel Controller
)Я застрял в точке, где каналы могут быть заблокированы, поскольку это (в соответствии со ссылкой в разделе комментариев к странице документации PHP) будет означать, что определенный канал заблокирован, и я хочу, чтобы несколько задач выполнялись одновременно, Мне нужно создать новый, о котором должен знать и мой сервер C #, что в заключение означает, что я могу установить только очень ограниченное число каналов, так сказать, «возможные» слоты для «работы» или «задач» сервер, к которому пользователь веб-приложения может присоединиться в [слот], и после этого слот очищается. Как бы то ни было, это разрушило бы концепцию моего асинхронного сервера на C # и основную идею, стоящую за ним, и я не могу думать об этом как об единственном решении.
Я с нетерпением жду некоторых предложений. Ура!
Задача ещё не решена.
Других решений пока нет …