insidestyles / swoole-bridge-bundle
Swoole Bridge For Php Frameworks
v2.1.1
2023-02-05 15:15 UTC
Requires
- php: >=7.2
- insidestyles/swoole-bridge: ^1.0
- laminas/laminas-diactoros: ^2.0
- nyholm/psr7: ^1.1
- symfony/console: ^5.0|^6.0
- symfony/framework-bundle: ^5.0|^6.0
- symfony/psr-http-message-bridge: ^1.0|^2.0
Requires (Dev)
- eaglewu/swoole-ide-helper: dev-master
- phpunit/phpunit: >=6.5
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'