2011-10-07 3 views
2

나는 이것에 대한 답을 찾아 보았으며 하나도 찾을 수 없었습니다. 누군가가 올바른 방향으로 나를 가리킬 수 있다고 생각합니다. 닫습니다.백그라운드에서 실행중인 프로세스의 상태를 확인하기 위해 AJAX 호출을 시도합니다.

두 명의 호스트가 host1.mydomain.com 및 host2.mydomain.com (호스트/브라우저 당 2 개의 동시 연결 문제를 해결하기 위해)을 사용하도록 지정 했으므로 둘 다 동일한 콘텐츠를 가리 킵니다. 하나는 다른 별칭입니다.

사용자가 host1.mydomain.com으로 이동하여 등록 할 정보를 입력하고 Go를 클릭하면 같은 페이지에서 iframe을로드하여 host2.mydomain.com의 페이지를 가리 킵니다 요청을 보내는 exec ("curl")를 통한 PHP 스크립트 웹 사이트 스크래퍼를 시작하기 위해 백그라운드로 실행되면 프로세스 ID가 사용자의 데이터베이스에 저장됩니다. iframe이 성공적으로로드 된 후 (배경 프로세스를 생성하는 데 1 초 밖에 걸리지 않습니다.) AJAX 요청이 주기적으로 cURL 프로세스의 상태 (데이터베이스의 프로세스 ID로)를 점검하여 표시 할 수 있도록 설정되었습니다 스크레이퍼의 현재 단계 (총 6 단계). 지금까지 좋은 모든 것.

문제는 두 개의 다른 호스트로 작업 중이므로 AJAX 요청이 스크래퍼의 4 단계 (브라우저 기본 시간 초과는 115/120 초) 후에 시간 초과된다는 것입니다 ... 의미 그것은 마치 내가 host2에서 긁는 도구를 시작했기 때문에 host1.mydomain.com에서 두 연결을 막히는 것과 같습니다.

iframe에 다음 URL이로드됩니다. http://host2.mydomain.com/page.php PHP 스크립트의 내용은 다음과 같습니다. :

exec("curl -o /dev/null 'http://host2.mydomain.com/page.php?method=process' > /dev/null & echo $!", $op); 

그러면 내 ajax 요청은 http://host1.mydomain.com/status.php?pid=x 스크레이퍼는 4 단계로 도착하면, 내 아약스 요청

을 타이밍

나는 나 자신이 설명 혼란 생각하지만 희망 누군가가 나를 도울 수있는 프로세스 ID에 의해 상태를 확인하기 위해 데이터베이스에 ooks

+0

CLI curl을'exec()'로 호출하는 대신 PHP의 기본 cURL 라이브러리 바인딩을 사용하는 것이 더 깨끗합니다. http://php.net/curl –

+0

문제는 백그라운드에서 실행해야한다는 것입니다 , PHP cURL 라이브러리를 사용하여 그렇게 할 수 있습니까? 왜냐하면 나는 스크래퍼가 실제로 웹 사이트를 긁어 모으기 위해 그것을 사용하기 때문입니다.나는이 방법으로 스크레이퍼를 초기화하는 단일 페이지를 더 쉽게 호출 할 것이고 백그라운드로 프로세스를 보낼 것이라고 생각 했으므로 –

+0

그리고 프로세스 ID를 알아야만 스크래퍼의 진행 상황을 모니터링 할 수 있습니다. PHP의 빌트인 cURL lib (적어도 내가 아는 것은 아님)를 사용하여 얻을 수는 없을 것입니다. –

답변

3

밝혀졌습니다. 서버 당 2 개의 연결/브라우저 제한을 성공적으로 해결했습니다 ... 그러나 일부 연구를 수행하면서 세션 데이터에 액세스하여 쓰기를 시도했기 때문에 내 Ajax 요청이 걸려있는 이유를 발견했습니다. 두 요청 모두에서. 조금 더 깊게 파고 가면 읽기/쓰기 세션을 닫는 session_write_close()를 발견했습니다. 기본적으로 스크래퍼의 각 페이지 요청 후 이것을 호출해야하며 세션을 다시 초기화해야합니다. 이렇게하면 내 아약스 요청이 통과하여 차단을 중지 할 수 있습니다. 요청의 이 같은 문제를 통해

건배를 우연히 발견하는 경우

바라건대 다른 사람이 유용하게 발견! Jeff

1

요청이 완료 될 때까지 기다리는 대신 서버의 백그라운드에서 실행되는 spawn new process이어야합니다. 그리고 자바 스크립트를 사용하여 몇 초마다 "다시 확인"하여 실행이 완료되었는지 확인하십시오. 그런 다음 결과를 가져 와서 표시하면됩니다.

또한 하나의 PHP 프로세스 만 생성되도록 할 수 있습니다.

관련 문제