insidestyles/swoole-bridge-bundle

Swoole Bridge For Php Frameworks

v2.1.1 2023-02-05 15:15 UTC

README

Symfony Swoole Bridge Bundle

需求

  • PHP >= 7.1
  • symfony/framework-bundle: "^5.0|^6.0"
  • insidestyles/swoole-bridge: "^1.0"
  • symfony/console: "^5.0|^6.0",
  • "laminas/laminas-diactoros": "^2.0"

安装

此软件包可通过Composer安装和自动加载

composer require insidestyles/swoole-bridge-bundle

更新config.yml

swoole_bridge:
    server:
        port: "%web_server_port%"      #The port the socket server will listen on
        host: "%web_server_host%"
        configs:
          document_root: '/app/public'
          enable_static_handler: true
          http_compression: true
          http_compression_level: 1

更新组件

     Insidestyles\SwooleBridgeBundle\SwooleBridgeBundle::class => ['all' => true],

用法

    php bin/console swoole:bridge:server

创建自定义处理程序

在运行长时间运行的PHP程序时,常见的一个问题是 "MySQL服务器已断开"(使用reactphp、websocket、swoole等长时间运行的PHP守护进程)。在这种情况下,我们可以创建一个自定义处理程序来处理此错误。例如

class CustomHandler implements SwooleBridgeInterface
{    
    /**
     * @var SwooleBridgeInterface
     */
    private $swooleBridge;

    /**
     * @var RegistryInterface
     */
    private $doctrineRegistry;

    /**
     * @var LoggerInterface
     */
    private $logger;

    /**
     * Handler constructor.
     * @param SwooleBridgeInterface $swooleBridge
     * @param null|LoggerInterface $logger
     */
    public function __construct(
        SwooleBridgeInterface $swooleBridge,
        RegistryInterface $doctrineRegistry,
        ?LoggerInterface $logger = null
    ) {
        $this->swooleBridge = $swooleBridge;
        $this->doctrineRegistry = $doctrineRegistry;
        $this->logger = $logger ?? new NullLogger();
    }

    /**
     * @inheritdoc
     */
    public function handle(
        SwooleRequest $swooleRequest,
        SwooleResponse $swooleResponse
    ): void {
        try {
            $this->swooleBridge->handle($swooleRequest, $swooleResponse);
        } catch (PDOException $e) {
            $this->logger->error($e->getMessage());
            /** @var Connection $connection */
            $connection = $this->doctrineRegistry->getConnection();
            if (!$connection->ping()) {
                $connection->close();
                $connection->connect();
            }
            $em = $this->doctrineRegistry->getEntityManager();
            if (!$em->isOpen()){
                $this->doctrineRegistry->resetManager();
            }
        } catch (\Throwable $e) {
            $this->logger->error($e->getMessage());
        }
    }
}
    

使用symfony服务装饰器覆盖默认处理程序

#config/services.yaml
services:
    swoole_bridge.custom_handler:
        class: App\CustomHandler
        decorates: swoole_bridge.handler
        arguments: 
            - '@swoole_bridge.custom_handler.inner'
            - '@doctrine'
            - '@logger'