2014-11-29 2 views
2

초기 조건 : PHP 코드로 작성된 코드가 있습니다. 처음에는 코드를 실행하고 있었고 실행하는 데 30 초가 걸렸습니다. 이 파일에서 코드는 5 번 호출되었습니다.실행 시간을 최소화하기 위해 PHP에서 코드를 병렬로 실행하십시오.

다음에 일어날 일 :이 코드를 50 번 실행하면 브라우저에서 한 번 실행하면 300 초가 걸리고, 500 초 동안은 3000 초 걸립니다. 따라서 코드의 직렬 실행입니다.

내가 필요한 항목 :이 코드를 병렬로 실행해야합니다. 몇 가지 예를 들자. 그래서 나는 사용자가 그렇게 오랜 시간을 기다리지 않도록 실행 시간을 최소화하고 싶습니다.

내가 무엇을했는지 : 나는이 코드를 병렬로 실행하기 위해 PHP CURL을 사용했다. 이 파일을 여러 번 호출하여 실행 시간을 최소화했습니다.

그래서 나는이 방법이 정확하다는 것을 알고 싶다. 얼마나 많은 CURL을 실행할 수 있으며 얼마나 많은 리소스가 필요한가요? 튜토리얼과 병행하여이 코드를 어떻게 수행 할 수 있을지 더 나은 방법이 필요하다.

도움이 될 것입니다.

답변

0

아마도 코드를 변경하지 않고 가장 단순한 옵션은 CURL이 아닌 명령 줄을 통해 PHP를 호출하는 것입니다. 이것은 APACHE (메모리와 속도면에서의 오버 헤드), 네트워킹 등의 오버 헤드를 줄입니다. Curl은 일부 서버가 (네트워크 측면에서) 스스로를 볼 수 없으므로 휴대용 옵션이 아닙니다.

$process1 = popen('php myfile.php [parameters]'); 
$process2 = popen('php myfile.php [parameters]'); 

// get response from children : you can loop until all completed 
$response1 = stream_get_contents($process1); 
$response2 = stream_get_contents($process2); 

당신은 $ _SERVER 추가 변수를 아파치에 대한 참조를 제거하고 ARGV /는 argc 참조와 $ _GET을 교체해야합니다. 둘 다 그렇지 않으면 그냥 작동합니다.

하지만 가장 좋은 해결책은 원하는 작업을 수행 할 수있는 pThreads (http://php.net/manual/en/book.pthreads.php) 일 것입니다. 약간의 코드 편집 (및 설치 가능)이 필요하지만 원하는 것을 수행합니다.

+0

안녕 popen은 2 매개 변수를 요구합니다. 모드의 2 번째의 파라미터 그래서 어떤 모드를 사용해야합니까? 위의 디렉토리에있는 다른 myfile.php. 뿐만 아니라 작동하지 않습니다. popen이 작동하는지 확인하는 방법은 무엇입니까? –

+0

필자는 단지 포인터 만 제공하고있다. 매뉴얼에 자세한 내용이있다. http://php.net/manual/en/function.popen.php fread()와 fclose()와 같은 누락 된 비트를 추가해야 할 것이다. 프로세스를 호출하는 다른 방법 (예 : proc_open)도 있습니다. – Robbie

0

PHP curl은 걱정할 필요가없는 오버 헤드가 충분합니다. 로드 밸런서를 통해 서버 팜에 대한 루프백 호출을 수행 할 수 있다면 컬의 좋은 사용 사례입니다. 또한 동일한 호스트 병렬 처리에 pcntl_fork()을 사용했지만 설정하기가 더 어렵습니다. 두 가지 모두에 기반한 수업을 작성했습니다. 내 PHP 라이브러리 https://github.com/andrasq/quicklib에서 아이디어를 얻으십시오. (또는 코드를 빌리면 오픈 소스입니다.)

+0

하지만 어떻게 pcntl_fork()를 사용할 수 있습니까? 나는 아무 생각이 없다. pls는이 예제와 관련하여 설명합니다. 다른 발신자 메일 ID와 다른 수신자로부터 1 분 안에 1000 개의 메일을 보내야합니다. 기능 또는 코드가 다른 발신자 메일 ID와 수신자 ID가 다른 기능을 형성 할 때마다 가져 오는 것을 의미합니다. –

0

Gearman을 사용해보십시오. 문서 : http://php.net/manual/en/book.gearman.php

+0

하지만 어떻게 기어 맨을 사용할 수 있습니까? 나는 아무 생각이 없다. pls는이 예제와 관련하여 설명합니다. 다른 발신자 메일 ID와 다른 수신자로부터 1 분 안에 1000 개의 메일을 보내야합니다. 은 다른 발신자 메일 ID와 수신자 ID가 다른 기능을 형성 할 때마다 기능 또는 코드를 얻음을 의미합니다. –