2012-05-23 5 views
0

이상한 문제가있어서 페이지에 fsockopen()이라는 연결을 열었습니다. 해당 페이지에 header(location:xx)이 있는데 (나는 스크립트를 새로 고치고 있습니다), 리디렉션이 작동하지 않습니다. .fsockopen() 및 헤더 (위치 : xxx)?

내가 브라우저로 복제하고있어 경우

분명히 모든 것이 작동 ...

일부 코드 :

연결 페이지 :

$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10); 
if($socketcon) { 
    $socketdata = "GET http://www.example.com/test2.php HTTP/1.0\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n"; 
    fwrite($socketcon,$socketdata); 
    fclose($socketcon); 
} 

CONNECTED PAGE (test2.php) :

<? 
//other code (working fine) 

if($_GET["AAA"]){ 

    //REDIRECT WORKED ! 

} else { 
    header("location:test2.php?AAA=1"); //same page but with a get param 
} 
?> 

은 REDIRECT이 ... 부분은 실행되지는 결코 일 했어요

어떤 제안이?

편집 : 연결이

+0

현재 솔루션이 작동하지 않습니다. 호출자 스크립트가 끝나자 마자 연결이 끊깁니다. 나는 당신이 AJAX를 원한다고 생각합니다. 그렇지 않으면, 방법이 없습니다. JavaScript를 사용하지 않는 한 연결이 끊어진 클라이언트를 마술처럼 리디렉션 할 수는 없습니다. – netcoder

+0

호출자 스크립트를 연 상태에서 브라우저를 닫더라도 비동기 부분이 이미 작동 중이므로 소켓과 함께 열린 스크립트가 실행 중입니다 ... 문제는 소켓 된 스크립트를 리디렉션 할 수 없다는 것입니다. – NicolaPasqui

+0

호출자가 스크립트가 끝나면 (즉, 마지막'?>'끝 태그에서), 소켓은 닫힌다. 당신은 그것이 효과가 있다고 생각할지 모르지만 그렇지 않습니다. 자바 스크립트를 사용하지 않으면 리디렉션 문제가 발생합니다. 당신이 질문을 적절히 공식화하지 않는 한, 당신이 원하는 것은'포함 '입니다. – netcoder

답변

1

비슷한 질문인데 Is making asynchronous HTTP requests possible with PHP?을 고려하십시오.

exec() -family 함수를 사용하면 반환 값이 필요하지 않은 경우 좋은 방법 일 수 있습니다. 당신은 단지 &에 의해 덧붙여지는 컬을 부를 수 있고 그것은 백그라운드에서 돌아갈 것이다.

정말로 PHP에서이 작업을 수행하려는 경우 : pcntl_fork()을 사용하여 새 프로세스를 생성하거나 직접 리디렉션을 처리 할 수 ​​있습니다.

  1. 이 응답 코드는 스트림에서 읽은 처음 세 문자를보고 무엇인지 결정 : 처리 할 수 ​​

    는 당신이 필요합니다 리디렉션합니다. 200은 성공을 의미하고, 300 년대의 것은 부분 성공을 의미합니다.

  2. 처음 세 문자에서 302 (또는 307)를 찾았 으면 위치 헤더를 검색하십시오. 이것은 정규식 /\s*location:\s*(.+)$/m과 일치 할 것이라고 나는 믿는다.
  3. 위치 입력란의 URL이 사용자의 예상과 일치하며 신뢰할 수 있음을 확인합니다. 절대 URL이어야하지만 안전한 서버, 안전한 포트, 안전한 URL 및 안전한 매개 변수가 있는지 확인해야합니다. parse_url()이 유용 할 수 있지만 은 잠재적 인 보안 문제가 있는지 확인하지 않습니다.
  4. 위와 일치하는 새 URL에 대한 새 연결을 엽니 다 (또는 Keep-Alive가있는 동일한 호스트에서 Keep-Alive를 사용하는 경우 연결을 다시 사용). 적절한 데이터를 보내십시오.
  5. 필요한 경우 결과/정리를 처리하십시오.

매우 복잡한 것을 알 수 있습니다. 이것은 재귀 적입니다. 당신이 정말로하고있는 일은 PHP에 기초적인 HTTP 파서를 작성하는 것입니다. 이것은 좋은 생각이 아닙니다. cURL을 사용하고 비동기로 만드는 다른 방법을 찾으십시오.

+0

exec()로 호출 된 스크립트는 curl과 같은 리디렉션을 따릅니 까? – NicolaPasqui

0

귀하의 연결 기능이 리디렉션을 처리하지 않는 비동기해야합니다.

지원하려면 직접 코드를 작성하거나 curl과 같은 라이브러리를 사용하여 연결해야합니다.

+0

내 편집을 참조하십시오. – NicolaPasqui

2

의견이 있으십니까? header('Location: X') 실제로 당신 (또는 브라우저) 새로운 요청하여 처리해야 303분의 301 HTTP 응답을 보내드립니다)

예, cURL 더 잘 할 수있는 일을하기 위해 소켓을 사용 중지합니다. 그러나 리디렉션을 처리하지 않는 것 같습니다. 반면에 cURL은 브라우저와 유사한 기능을 모방하고이를 사용하여 리디렉션을 수행 할 수 있습니다. curl_setopt($curlResource, CURLOPT_FOLLOWLOCATION, true);

+0

중요한 것을 잊어 버렸습니다. 그것은 비동기식이어야합니다. 그래서 나는 컬을 사용하지 않았습니다 ... – NicolaPasqui

+0

@Il_pasqui이 경로에서 계속하려면 직접 리디렉션을 처리해야합니다. 그건 그렇고. PHP는 순차적으로 실행됩니다. 즉, 스크립트를 병렬로 실행하지 않는 한 비동기식 요청을하지 않습니다. –

+0

어떻게 리디렉션을 처리 할 수 ​​있습니까? 헤더 (위치)가 소켓에 의해 페이지가 열리면 작동하지 않는다는 것이 확실합니다 ... 그래서 대안이 있습니까? 난 그냥 다시 스크립트를 실행할 필요가, 나는 소켓으로 다시 연결하려고 할 수 있지만 그것은 reeeally 나쁜 일을 .... 감사합니다! – NicolaPasqui