2010-04-20 12 views
2

MySQL DB에서 쿼리 한 데이터에서 PHPExcel을 사용하여 보고서를 생성하는 PHP 스크립트가 있습니다. 현재, 그것은 MySQL에서 데이터를 다시 얻고, Excel 템플리트를 읽고, 템플리트에 데이터를 기록한 다음 출력합니다. 데이터가 한 번만 반복되고, PHP 쪽에서 처리되는 코드가 거의 없다는 점에서 코드를 최적화했습니다. 쿼리는 .001 초 미만의 수백 줄을 반환하므로 충분히 빠르게 실행됩니다. 약간의 타이밍 후에 나는 템플릿을 읽고 결과물을 쓰는 내 병목 현상 (깜짝 놀랍게도)을 발견했다. 나는이 일을하고 싶습니다 : PHP의 멀티 스레딩/병렬 처리

Spawn a thread/process to read the template 
Spawn a thread/process to fetch the data 
Return back to parent thread - Parent thread will wait until both are complete 
Proceed on as normal 

내 주요 질문

이 가능하며, 그것이 가치가있다? 양쪽에 모두 그렇다면, 어떻게 해결할 수 있습니까? 또한 CentOS에서 PHP 5입니다.

답변

8

일반적으로 Apache 프로세스를 포크로 만드는 것은 좋지 않습니다. 결과가 불확실해질 수 있습니다. 대신, 어떤 종류의 큐 메커니즘을 사용하는 것이 좋습니다. Gearman은 사용할 수있는 오픈 소스 큐 메커니즘입니다. 또한 작업을 비동기 적으로 실행하는 것에 대한 Zend Server 작업 대기열에 대한 블로그 게시물이 있습니다. Do you queue? Introduction to the Zend Server Job Queue.

또한 Zend Framework Queuing 클래스와 같은 것을 사용하여 일부 비동기 작업을 구현할 수도 있습니다. Zend_Queue

@Swisstack, 또한 PHP가 고성능을 위해 만들어지지 않는다는 귀하의 주장에 동의하지 않을 것입니다. 언어 기능이 성능 저하의 원인이되는 경우는 거의 없습니다. 아마도 다른 언어에서 $ a ++를 비교하는 원시 언어 테스트를 수행하면 알 수 있습니다. 그러나 테스트 유형은 부적합합니다. 필자는 PHP에 대한 컨설팅을 수년간 해왔으며 언어로 인한 성능 문제를 본 적이 없습니다.

+0

+1. 나는 그가 웹 서버를 통해 이것을 실행하지 않는다고 가정하고있다. – webbiedave

+0

글쎄, 하나 너무 많이 추측 할 수 없다. 그러나 그렇다고하더라도 일종의 일자리 대기열은 보통 더 좋은 길입니다. 더 관리하기 쉽습니다. –

1

더 빠르게 읽을 수있는 형식으로 템플릿을 캐시하거나 저장할 수 있는지 알아 내려고합니다. 그게 가능한지 모르겠지만 PHPExcel 포럼은 꽤 좋으며 개발자가 지켜보고 있습니다.

0

CentOS에서 PHP (http://php.net/manual/en/function.pcntl-fork.php)로 프로세스를 생성 할 수 있습니다. 템플릿을 읽고 출력을 작성하는 과정에서 병목 현상이 발생하는 경우 I/O 바인딩 문제 일 수 있으므로 다중 processess를 처리하면 많은 도움이되지 않을 수 있습니다. ... 개인적으로 캐싱을 대신 할 수 있는지 알아 보려고합니다 ...

1

멀티 스레드는 할 수 없지만 fork 할 수는 있습니다 (pcntl_fork, pcntl_wait). 확실히 알고 있듯이 프로세스 상황을 신중하게 테스트하여 상황에 따라 가치가 있는지 확인해야합니다.

$pid = pcntl_fork(); 

if ($pid == -1) { 
    // fork failed 

} elseif ($pid > 0) { 
    // we're the parent! Wait for child to finish 
    pcntl_waitpid($pid); 

} else { 
    // we're the child 
} 
1

템플릿을 읽고 AND 쿼리가 느린 경우 병렬 작업을 실행하여 보람있는 성능을 얻을 수있는 적절한 기회가 있다고 말하고 싶습니다. 그러나 템플릿을 읽는 것이 느리고 db 쿼리가 빠르다고 스스로 말했습니다. 따라서 추가 작업으로 인해 추가로 발생하는 오버 헤드를 무시하더라도 작업을 병렬로 실행하는 데 필요한 시간이 필요합니다. 최상의 경우에는 0.001 초 (db 쿼리에 필요한 시간)를 절약 할 수 있습니다.

여러 작업을 동시에 실행하면 항상 가장 느린 작업 시간이 필요합니다. 연속적으로 작업을 실행하는 것은 모든 작업을 합한 것입니다. 귀하의 경우 templateTime + queryTime (0.001)

가치가 없습니다.

일반적으로 데이터베이스는 방정식의 거북이입니다. 너무 많은 노력 없이도 비동기로 할 수 있습니다.새로 추가 된 mysqli_poll()과 friend 함수를 보라.

0

템플릿을 한 번 읽은 다음 데이터에서 만들어야하는 각 통합 문서에 대한 복제본을 만듭니다.

+0

안녕하세요. Mark, 예를 들어 hava에 링크 된 적이 있습니까? 그것은 매우 높이 평가 될 것입니다! 감사! – mongotop