ruth/async-service-call-bundle 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

ruth/async-service-call-bundle

Composer 安装命令:

composer require ruth/async-service-call-bundle

包简介

Symfony bundle for asynchronous service methods calls

README 文档

README

Latest Stable Version Total Downloads Latest Unstable Version License

This bundle allows you to execute methods of your services asynchronously in a background process.

It is a fork on krlove/async-service-call-bundle, updated to run in Symfony 4 or 5.

Installation

Install using composer:

composer require ruth/async-service-call-bundle

It should enable the bundle at config/bundles.php

return [
   ...
   new Krlove\AsyncServiceCallBundle\KrloveAsyncServiceCallBundle(),
]

If not, you now know what to do.

Configuration

Options:

  • console_path - path to console script. Can be absolute or relative to kernel.project_dir parameter's value. Defaults to bin/console Symfony 4.* and Symfony 5.*.
  • php_path - path to php executable. If no option provided in configuration, Symfony\Component\Process\PhpExecutableFinder::find will be used to set it up.

Example:

# config/packages/krlove_async_service_call.yaml
krlove_async_service_call:
    console_path: bin/console
    php_path: /usr/local/bin/php

Usage

Define any service:

<?php
    
namespace App\Service;
    
class AwesomeService
{
    public function doSomething($int, $string, $array)
    {
        // do something heavy
        sleep(10);
    }
}

Register service:

# services.yml
services:
    app.service.awesome:
        class: App\Service\AwesomeService
        public: true

make sure your service is configured with public: true

Execute doSomething method asynchronously:

$this->get('krlove.async')
     ->call('app.service.awesome', 'doSomething', [1, 'string', ['array']);

Line above will execute App\Service\AwesomeService::doSomething method by running krlove:service:call command on background.

You can follow it's execution by calling top on your console.

Original approach with symfony process Symfony\Component\Process\Process was abandoned in favor of a more traditional exec php function. The reason is this (that you can find in upper page):

If a Response is sent before a child process had a chance to complete, the server process will be killed (depending on your OS). 
It means that your task will be stopped right away. 
Running an asynchronous process is not the same as running a process that survives its parent process.

Usage with Symfony Process Component

It is also possible to run your service with Symfony Process Component, and with that having an asynchronous service with a response (or exception) during request / response context.

For that you just have to call method getProcessInstance like this:

// 1. Standard way:
$process = $this->get('krlove.async')
                ->getProcessInstance('app.service.awesome', 'doSomething', [1, 'string', ['array']);
                
// and to run asynchronously
$process->start();

// ... do other things

$process->wait();

// ... do things after the process has finished
$result = $process->getOutput();

// 2. With callback function after service finishes:
$process = $this->get('krlove.async')
                ->getProcessInstance('app.service.awesome', 'doSomething', [1, 'string', ['array']);
                
// and to run asynchronously
$result = null;
$process->start(function ($res) use($process, &$result) {
                    $result = $process->getOutput();
                });

// ... do other things

$process->wait();

// you now have result from async service call available at $result variable.

You have more information about Symfony Process Component here

统计信息

  • 总下载量: 33
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 0
  • 点击次数: 2
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 0
  • Watchers: 0
  • Forks: 5
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2020-04-07

承接程序开发

PHP开发

VUE

Vue开发

前端开发

小程序开发

公众号开发

系统定制

数据库设计

云部署

网站建设

安全加固