2013-11-22 2 views
3

Symfony 2.3 프로젝트에 일부 HTTP 요청을 처리하는 데 시간이 걸리는 클래스가 있습니다.Symfony2 및 백그라운드 프로세스

이 작업을 백그라운드 프로세스로 실행하여 서버가 클라이언트에 대한 응답을 반환하고 백그라운드 프로세스가 계속 실행되도록하고 싶습니다.

Symfony에서 어떻게하는지 알고 계십니까?

프로세스 구성 요소가 발견되었습니다 : http://symfony.com/doc/current/components/process.html하지만 거기에서 클래스 메서드를 실행할 수 있는지 확실하지 않습니다.

답변

7

간단한 방법은 대기열과 symfony 명령을 사용하여 대기열을 처리하여 응답에서 무거운 것을 분리하는 것입니다.

http://symfony.com/doc/current/components/console/introduction.html

는 컨트롤러에서 큐에 수행 할 수있는 작업을 한 후, 작업이 대기열에 추가 처리하는 심포니 만들기 명령을 추가 할 수 있습니다. 대기열은 아마도 작업의 데이터베이스 테이블로 구현됩니다.

그런 식으로 사용자에게 성공한 응답을 보내고 정기적으로 서버에서 cron 작업을 실행하여 필요한 작업을 처리 할 수 ​​있습니다.

+0

존 감사합니다, 오늘 그걸 시도 할게요. +1. –

+0

근로자를위한 크론 사용은 위험합니다. 이것을 고려하십시오 : cron을 사용하여 매분마다 작업자를 실행하지만 작업자는 작업을 수행하는 데 1 분 이상 소요됩니다. 일반적인 성능을 저하시키는 많은 프로세스가 자원 경쟁에 종사했습니다.서버가 다운 될 수 있습니다. –

0

이것은 enqueue 라이브러리로 쉽게 할 수 있습니다. 먼저 AMQP, STOMP, Redis, Amazon SQS, Filesystem 등과 같은 다양한 transports 중에서 선택할 수 있습니다.

둘째, 사용하기 쉽습니다. 설치 시작 :

enqueue/enqueue-bundle 라이브러리와 one of the transports을 설치해야합니다.

composer require enqueue/enqueue-bundle enqueue/fs 
이제

의 당신이 당신의 POST 스크립트에서 메시지를 보낼 수있는 방법을 보자 : 당신이 프로세서 서비스를 생성해야하고 그것을 태그 소비를 들어

<?php 

use Enqueue\Client\ProducerInterface; 
use Symfony\Component\DependencyInjection\Container; 

/** @var Container $container */ 

/** @var ProducerInterface $producer */ $producer = $container->get('enqueue.client.producer'); 

$producer->sendCommand('a_background_task', 'task_data'); 

당신은 파일 시스템 enqueue/fs 라이브러리를 선택 가정 enqueue.client.processor 태그 :

<?php 

use Enqueue\Client\CommandSubscriberInterface; 
use Enqueue\Psr\PsrContext; 
use Enqueue\Psr\PsrMessage; 
use Enqueue\Psr\PsrProcessor; 

class BackgroundTask implements PsrProcessor, CommandSubscriberInterface 
{ 
    public static function getSubscribedCommand() 
    { 
     // do job 

     return self::ACK; 
    } 

    public function process(PsrMessage $message, PsrContext $context) 
    { 
     return 'a_background_task'; 
    } 
} 

그리고 명령과 함께 소비자 실행

./bin/console enqueue : 소비 --setup-broker -vvv

대다수의 소비자가 필요할 가능성이 높습니다. 프로세스가 존재하면 재시작해야합니다. 이 문제를 해결하려면 일종의 프로세스 관리자가 필요합니다. 몇 가지 옵션이 있습니다.

http://supervisord.org/ - 추가 서비스가 필요합니다. 제대로 구성해야합니다. 이와 같은 순수 PHP 프로세스 관리자. Symfony 프로세스 구성 요소와 순수 PHP 코드를 기반으로합니다. 프로세스 재부팅, sigterm 신호 종료 등을 처리 할 수 ​​있습니다. php \ swoole 프로세스 관리자가 이와 같습니다. 그것은 swoole PHP 확장을 필요로하지만 그것은 성능이 놀랍습니다.