2009-09-23 4 views
1

RESTful 서버와 인터페이스하는 PHP 클라이언트 애플리케이션이 있습니다. 클라이언트의 각 PHP Goat 인스턴스는 서버에서/goat 요청의 정보 (예 :/goat/35,/goat/36 등)를 기반으로 초기화해야합니다. cURL을 통해 해당 URL에 HTTP 요청을 보냄으로써이를 수행합니다. 페이지 당 30+ 염소 개체로 작업하는 것은 30 + HTTP 요청과 같으며 각각 0.25 초가 걸립니다. 즉 염소가 말하듯이 baaaad입니다. 메모리에 응답을 지연로드하고 캐싱하는 것은 도움이되지만 충분하지 않습니다.객체 지향 PHP의 비 차단 HTTP 요청은 무엇입니까?

foreach ($goats as $goat) { 
    $goat->getName() // goat needs to hit the REST API 
} 

이 기술의 장점은 내 염소 모든 스마트 캡슐화 점이다. 단점은 성능이 끔찍하다는 것입니다. 염소는 HTTP 요청을 대기열에 넣는 방법을 모릅니다. 요청을해야하는 다른 염소가 있는지 염소 하나가 알지 못합니다. 외래 염소를 만들 수있는 방법이 하나 있습니다.

$urls = array('http://', 'http://', ...); // array of goat URLs 
$result = fancy_pipelined_http_request_queue($urls); 
foreach ($result as $xml) { 
    $goat->buildSelfFromXML($xml); 
} 

이것이 더 잘 알려진 OO/REST 딜레마 인 것으로 확신합니다. 더 나은 고급 해결 방법이 있습니다. 나는 어디에서 봐야할지 모르겠습니다. 어떤 아이디어?

+1

나는 여전히 조언에 관심이 있지만, 그 동안 확인해보십시오. 각 염소는 자신의 컬 핸들을 사적인 변수로 사용하고있었습니다. 테스트로, 나는 그것을 정적으로 만들었으므로 (하나의 핸들이 모든 염소들 사이에서 공유 될 수 있습니다),로드하는 데 8 초가 걸린 페이지는 0.9가 걸립니다. 나는 그것이 모두 HTTP 요청 대기 시간 때문이라고 생각했다 ... – alexantd

+0

@alexantd, 항상 그렇듯이, 프로필 우선, 비난 초 : – vava

+0

유사/Dublicate : http://stackoverflow.com/questions/1432477/can-php-asynchronously- 사용 소켓 –

답변

1

원하는 경우 비 차단 소켓을 사용할 수 있습니다. 이것은 컬을 제쳐 놓고 걷어차 야 할 필요가 있기 때문에 그들에게 전환하기위한 약간의 코딩이 필요합니다. 그러나 이렇게하면 실제로 요청을 동시에 수행 할 수 있으므로 성능이 향상 될 수 있습니다.

socket_set_blocking/stream_set_blocking 기능을 참조하십시오.