2013-07-22 2 views
0

나는 실행하는 데 시간이 걸리고 우선 순위가 낮은 코드 조각이 있습니다. sendToQueue 내부 함수가 $ 객체가 인출 및 반환과 BG에서 실행된다 지연 wouldnt가 어디 PHP에서 내가php : queue/dont 지연 사용자

public function put() { 

    $comment = array('title' => 'my title', 'description' => 'my description'); 

    sendtoQueue($this->internalCall('controller' => 'Comment', 'data' => $comment); 

    $object = $this->get('id' => $this->id); 
    return $object; 
} 

처럼 뭔가를 할 수 있는지 궁금했다.

가능합니까? 파이썬에 던질 수 있지만 현재 범위 내에서 실행되도록하고 싶습니다.

+1

AJAX에서 스크립트를 실행하면 어떨까요? –

+0

이것은 API 프로젝트이므로 PUT 요청은 많은 일을하고 있지만 그 중 일부는 응답 속도가 느려지고 있습니다. – azz0r

답변

1

현재 범위에서 실행해야하는 경우 프로세스를 포크 (pcntl_fork()) 처리하고 부모가

을 처리하는 동안 처리하도록합니다.

그렇지 않으면 주기적으로 작업 대기열을 비우기위한 스크립트를 실행하십시오.

+0

아, 다시 컴파일해야합니다 ... – azz0r

+0

및 열린 연결 문제로 고민 할 준비를하십시오. 또한, 내가 아는 한, 부모 프로세스가 죽으면 자식 프로세스가 죽습니다. 우리의 웹 프로세스는 http 요청이 끝날 때 죽을 것입니다. –

1

exec을 사용하면 백그라운드에서 스크립트를 실행하고 sendToQueue를 반환하는 새로운 PHP 프로세스를 시작할 수 있습니다.

beanstalkD과 같은 솔루션을 사용할 수도 있습니다. sendtoQueue가 Beanstalk에 데이터를 보내고 작업자가 백그라운드에서 대기열을 비우는 경우

+1

Exec은 현재 사용자 또는 작업의 범위를 유지하지 않습니다. 따라서 코드를 다시 작성하기 위해 새 스크립트를 만들어야하기 때문에 Execution을 피하고 싶었습니다. BeanstalkD가 재미있어 해 보인다. 불행하게도 이것이 유일한 방법 일 것이라고 생각한다. – azz0r

0

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

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

enqueue/simple-client 라이브러리와 one of the transports을 설치해야합니다. 파일 시스템을 선택한다고 가정하면 enqueue/fs 라이브러리를 설치하십시오. 요약 : 사용하여 당신과 같은

<?php 
// consumer.php 

use Enqueue\SimpleClient\SimpleClient; 
use Enqueue\Psr\PsrProcessor; 
use Enqueue\Psr\PsrMessage; 

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

$client = new SimpleClient('file://'); 

$client->bind('a_topic', 'a_processor_name', function(PsrMessage $psrMessage) { 
    // processing logic here 

    return PsrProcessor::ACK; 
}); 

// this call is optional but it worth to mention it. 
// it configures a broker, for example it can create queues and excanges on RabbitMQ side. 
$client->setupBroker(); 

$client->consume(); 

실행 많은 consumer.php 프로세스 :

<?php 
// producer.php 

use Enqueue\SimpleClient\SimpleClient; 

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

$client = new SimpleClient('file://'); // the queue will store messages in tmp folder 

$client->sendEvent('a_topic', 'aMessageData'); 

소비 스크립트 : 이제

composer require enqueue/simple-client enqueue/fs 

을의 당신이 당신의 POST 스크립트에서 메시지를 보낼 수있는 방법을 살펴 보자 supervisord 또는 다른 프로세스 관리자는 로컬 컴퓨터에서 별도의 lib 또는 패키지없이 실행할 수 있습니다.

기본 예이며 대기열에 추가 할 수있는 많은 기능이 있습니다. 관심이 있으시면 enqueue documentation을 확인하십시오.