2017-04-05 4 views
0

심포니 프로세스 구성 요소로 고아 인 백그라운드 프로세스를 실행하고 싶습니다. kernel.terminate 이벤트를 사용할 수 없습니다.심포니 프로세스 - 백그라운드 작업

이 내가 실행하고자하는 프로세스입니다 : 이것은 내가 할 노력했다 것입니다

// script.php 
$f = fopen('test'.uniqid().'.txt', 'w'); 
for ($i = 0; $i < 1000; $i++) { 
    fwrite($f, "Line $i \n"); 
    sleep(2); 
} 
fclose ($f); 

는 그리고 이것은 내 프로세스를 실행하고자하는 스크립트입니다

// test.php 
$command = "php script.php > /dev/null 2>&1 &"; 

$p = new \Symfony\Component\Process\Process($command); 
$p->start(); 
echo $p->getPid()."\n"; 

을 문제는 test.php 종료 후 script.php이 작동하지 않는다는 것입니다. 주 스크립트를 종료하면 모든 하위 프로세스가 종료됩니다. 심포니 프로세스로 고아 프로세스를 실행할 수 있습니까?

+1

내가 대답하기 전에 무엇을 먼저 이루고자합니까? – Augwa

답변

1

가장 쉬운 방법, 프로세스 구성 요소를 사용하여 PHP 간부로 다시 떨어지지 않습니다 크론 탭이 명령을 실행되는 더 단단한 솔루션의

http://php.net/manual/de/function.exec.php

exec('php script.php > /dev/null 2>&1 &'); 

일정 같은 것을 고려하고 시작 사람이 시작해야 할 때의 과정.

+0

저는 OP가 이미하고있는 것과 같은 일을 할 것이라고 확신합니다. – Augwa

+1

그렇지 않습니다. 프로세스 구성 요소는 프로세스 구성 요소가 모니터링하는 출력에 대한 리소스를 실제로 반환하는 proc_open을 사용합니다. exec는 작동이 다르다. 실행되고 명령이 끝날 때 마지막 '&'이 주어진다.) – Joe

+0

확인 됨 :) 감사는 새로운 것을 배웠다. – Augwa

0

사용자 지정 큐와 함께 at (atd) 또는 cron을 사용할 수 있습니다. PHP는 나중에 실행하기 위해 원하는 명령을 큐에 넣는 동기 명령을 호출합니다. at은 유닉스 시스템의 매우 강력하고 표준적인 구성 요소입니다. at now + 10 min을 실행하고 명령을 표준 입력으로 보내면 atd 데몬은 10 분 안에 명령을 실행합니다.

PHP에서 직접 명령을 실행하려면 쉘을 추가하십시오 : new Process('/bin/sh -c "php script.php &"'). 정확히 Process 클래스가 명령을 호출하는 방법을 잘 모르겠지만 &이 작동하지 않으면 사이에 하나 이상의 셸이 트릭을 수행합니다 (즉, exec()).