2011-03-23 5 views
22

동일한 서버 또는 다른 서버에있는 페이지로 POST 호출을 수행하는 방법을 구현해야합니다. include 파일을 사용할 수 없습니다. 일반적으로 호출하는 파일이 다른 데이터베이스를 호출하거나 같은 이름의 함수를 가지고 있기 때문입니다.동일한 서버에 CURL 요청을 수행 할 수 있습니까?

저는 curl을 사용하여 이것을 구현하려고 시도했지만 다른 서버에서 파일을 호출 할 때 완벽하게 작동하지만 파일이있는 서버와 동일한 서버를 호출 할 때는 아무 것도 얻지 못합니다.

편집은 일부 코드를 추가 : 내가 뭘하는지의 단순화 된 버전 :

File1.php

<?php 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "www.myserver.com/File2.php"); 
curl_setopt($ch, CURLOPT_FRESH_CONNECT, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_VERBOSE, true); 
$result = curl_exec($ch); 
curl_close($ch); 
echo $result; 
?> 

File2.php

<?php 
echo "I'M IN!!"; 
?> 

을 File1.php를 호출 한 후 , 나는 아무것도 얻지 못한다. 그러나 File2.php가 다른 서버에 있다면 나는 결과를 얻는다. 도움이 되었습니까?

내가 서버 URL (HTTP ...)와 파일의 전체 주소를 모두 사용하여 시도 (/ 홈/WWWW을 ....)

+0

일부 해킹 된 해결 방법에 대한 실질적인 문제를 수정하지 마십시오. –

+0

예, 정상적으로 요청할 수 있지만 로컬의 파일로 URL을 변경하지 마십시오. 예를 들어 URL을 원격 서버로 사용하십시오. http://site.com. 귀하의 코드를 볼 수 있습니까? –

+0

"http://mysite.com"과 같이 전체 주소를 사용하는 대신 "localhost"를 사용하십시오. 내 경우 엔 효과가 있었어. – MKatleast3

답변

44

당신이로 CURL 요청을 발행하는 경우주의하십시오 자신의 사이트, 기본 세션 처리기를 사용하고 있고 CURL을 통해 요청하는 페이지가 요청을 생성하는 페이지와 동일한 세션을 사용하면 교착 상태가 발생합니다.

기본 세션 처리기는 페이지 요청이 지속되는 동안 세션 파일을 잠급니다. 동일한 세션을 사용하여 다른 페이지를 요청하려고하면 요청이 시간 초과되거나 세션 파일이 사용 가능해질 때까지 그 후속 요청이 중단됩니다. 내부 CURL을 수행 중이므로 CURL을 실행하는 스크립트는 세션 파일에 대한 잠금을 유지하며 CURL 요청은 대상 페이지가 세션을로드 할 수 없으므로 절대 완료 할 수 없습니다.

+0

그래서 같은 서버에 CURL 요청을 할 수 없습니까? 이 문제를 해결할 방법이 있습니까? – Trialien

+21

CURL 요청을하는 스크립트가'curl_exec()'직전에'session_write_close()'로 세션을 닫는 지 확인할 수 있습니다. 나중에 세션에서 무엇인가를 변경해야한다면'session_start()'를 다시 할 수 있습니다. –

+3

Marc의 코멘트가 대답에 있어야한다고 생각합니다. 여기서 내 문제를 해결했습니다. –

1

코드를 리팩터링해야합니다. Marc B가 말한 것에 덧붙여,이 접근법은 스크립트를 불필요하게 느리게 만들어 잠재적으로 큰 마진으로 혼란을 야기합니다. 불쾌감은 없지만 이것은 나쁜 논리에 대한 믿을 수 없을 정도의 고의적 인 수정 일뿐입니다.

+0

무슨 뜻인지는 알지만, 프로덕션 서버에서 수행하고있는 작업이 아니며 성능이 문제가되지 않는 백그라운드 프로세스에 사용됩니다. 발행물. 귀하의 의견을 보내 주셔서 감사합니다. – Trialien

2

공용 IP로 로컬 서버에 요청하려고했을 때 apache가 로컬 도메인으로 확인할 수 없었기 때문입니다. 그래서 당신은 어떤 로컬 IP 아파치가 해당 도메인을 사용하고 있는지 확인해야합니다. 그런 다음/etc/hosts 파일을 편집하고 로컬 IP와 도메인을 추가 한 새 행을 추가해야합니다. 예를 들어 : 172.190.1.120 내 도메인 mydomain.com 그래서 내가 추가 할 것입니다 :

아파치의 가상 호스트에서 해당 도메인에 대한 내 로컬 IP는

172.190.1.120 mydomain.com

다음 당신의 컬은 제대로 작동 할 것입니다.

+0

이것은 나에게 일어났다 :) 곱슬 곱슬 한 요청은 모든 URL에 작용했지만 나의 것이고 이것은 트릭을했다. 솔루션을 가져 주셔서 감사합니다. – Sogeking

관련 문제