Задать вопрос
@dhose

Как организовать обмен данными между приложениями PHP?

Привет всем!

Нужно организовать обмен данными между двумя приложениями PHP, запросов ооочень много (100 запросов в секунду), при этом их объем очень маленький - тут важно организовать это так, что бы работало со скоростью света.

В общем есть два приложения PHP - нужно сделать между ними супер быстрый обмен мелкими командами, типа go; stop; read и тп

сейчас это все реализовано следующим с помощью обычного http get, может у кого есть идеи как это ускорить?

Приложение 1 базируется на Windows, запущенный PHP скрипт из командной строки, в котором зациклен запрос на получение команды:

//циклим бесконечность
while (true){
  
  //циклим до получения команды
  while (!$command){

       //запрашиваем команду
       $command=file_get_contents("http://site.com/command.php");
   }

   //обрабатываем команду
  if(command=="get_app_status"){

     ....... делаем некое действие соответсвующее команде (читаем txt файл)
     $result=$text;
     
    //возвращаем результат
     echo $result;

  }

}


Заранее спасибо!
  • Вопрос задан
  • 715 просмотров
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 3
Hakujin
@Hakujin
Разрабочик
Ну, вы могли бы открыть сокет на демоне и слушать его, а со второго приложения, соответственно соединения бросать.
Это всяко будет быстрее, чем через вебсервер по http обращаться.
Ответ написан
Комментировать
Minifets
@Minifets
Hello world!!!
Как вариант можно внедрить сервис очереди сообщений.

Gearman например.
Ответ написан
eXcNightRider
@eXcNightRider
FullStack Web Developer | DevOps
Существует отличная реализация сокетов с поддержкой протокола WAMP на PHP - Ratchet. Подробная документация на этом сайте
А теперь рецепт из практики:
1. Собираем простое приложение с помощью composer, нам понадобится пакет cboden/ratchet
2. Пишем базовый класс
<?php
namespace MyApp;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class Msg implements MessageComponentInterface {
    public function onOpen(ConnectionInterface $conn) {
    }

    public function onMessage(ConnectionInterface $from, $msg) {
    }

    public function onClose(ConnectionInterface $conn) {
    }

    public function onError(ConnectionInterface $conn, \Exception $e) {
    }
}

Четыре определённых в коде функции обязательны, они предназначены для обработки соответствующих событий
3. PHP-CLI скрипт, который запустит сервер сокетов и будет принимать сообщения:
msg-server.php
<?php
use Ratchet\Server\IoServer;
use MyApp\Msg;

    require dirname(__DIR__) . '/vendor/autoload.php';

    $server = IoServer::factory(
        new Msg(),
        8080
    );

    $server->run();

Если запустить данный файл командой
php bin/msg-server.php
Сервер будет работать и к нему можно даже подключиться с помощью telnet
telnet localhost 8080

4. Клиентская часть - пакет ratchet/pawl
5. Пример реализации:
<?php

    require __DIR__ . '/vendor/autoload.php';

    \Ratchet\Client\connect('ws://192.168.1.100:8080')->then(function($conn) {
        $conn->on('message', function($msg) use ($conn) {
            echo "Received: {$msg}\n";
            $conn->close();
        });

        $conn->send('Hello World!');
    }, function ($e) {
        echo "Could not connect: {$e->getMessage()}\n";
    });


Для передачи структурированных данных можно использовать традиционный JSON
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы