fsockopen과 fgets를 사용할때 문제가 있습니다.

lkjt의 이미지

PHP에서 fopen으로 웹사이트를 열어 수신받을때
fgets를 사용해도 아무 탈 없습니다.
그런데 fsockopen으로 웹사이트에 쿼리를 보내서
수신받을때
while(!feof($fp))
fgets($fp, 128)
로 하면, 60초 타임아웃이 납니다.(이렇게 오래 안걸리는 작업인데;;)
while대신에 for로 해봣더니
잘 됩니다.
하지만 이방법은 적당하지 않아보입니다.

		$c=fread($fp, 1);
		if($c==NULL)
			break;
		$cntnt.=$c;

이런식으로 서도 안되구요...

어떻게 해결해야하죠???

송효진의 이미지

$data = '';
while(false !== ($temp = fgets($fp))) {
    $data .= $temp;
}

이렇게 해 보세요.

그리고, 언어를 명시해 주시는것이 좋다고 생각됩니다.
제목만 보고는 잘 티가 안나서 안보거나,
오해해서 보는 경우가 있겠네요.

lkjt의 이미지

송효진 wrote:
$data = '';
while(false !== ($temp = fgets($fp))) {
    $data .= $temp;
}

이렇게 해 보세요.

그리고, 언어를 명시해 주시는것이 좋다고 생각됩니다.
제목만 보고는 잘 티가 안나서 안보거나,
오해해서 보는 경우가 있겠네요.

앗, 죄송합니다.
제목에 적으려다가 제목이 길어져서 안쓰고 본문에 쓰려고 했는데, 깜빡했네요. 이언어는 PHP입니다.

가르쳐주신대로 했는데도 타임아웃이 나네요...
이소스 코드에서 타임아웃은 fgets 줄에서 납니다.

송효진의 이미지

혹시 헤더를 안보내셨습니까?
http://kr.php.net/manual/en/function.fsockopen.php

http 연결을 할 때는 먼저 보내고 받습니다.

익명 사용자의 이미지

송효진 wrote:
혹시 헤더를 안보내셨습니까?
http://kr.php.net/manual/en/function.fsockopen.php

http 연결을 할 때는 먼저 보내고 받습니다.


아닙니다.
GET 로 시작되는 것을 보냈습니다.
for로 일정수 루프 돌리면 받아집니다.
kirrie의 이미지

꼭 fsocketopen을 써야하는 상황이 아니면 file_get_contents는 어떤가요? 물론 이것은 allow_url_fopen이 on인 상황에서만 동작합니다만, 소스를 읽어와서 string으로 리턴합니다. 다른건 신경써줄 필요도 없고 편하던데...

$url = "http://kldp.org";
$string = file_get_contents($url);
echo $string;

--->
데비안 & 우분투로 대동단결!

익명 사용자의 이미지

아...

referer체크를 해서요...

lifthrasiir의 이미지

Anonymous wrote:
아...

referer체크를 해서요...

pear의 HTTP_Request같은 라이브러리를 쓰실 것을 권합니다.

- 토끼군

송효진의 이미지

다 귀찮으면....
$text = shell_exec('wget -q --referer "'.$referer.'" -O /dev/stdout "'.$targeturl.'"');

소타의 이미지

타임아웃이 나는 이유가.. 요청 시 프로토콜을 HTTP/1.0 이상으로 하였고 Connection: keep-alive 를 보냈기 때문에 웹서버가 응답을 다 하고도 연결을 끊지 않아서 eof가 발생하지 않은 것 입니다.
HTTP/1.1은 Content-length 헤더로 보내져 오는 컨텐츠의 양을 판단해야 합니다.. 또는 chunked 응답이라면 보내오는 컨텐츠의 내용에 붙어 있는 chunk들을 분석해서 컨텐츠의 끝을 알아내야 합니다.
쉽게 가시려면 HTTP/1.0, Connection: close로 요청하시고 어렵게 하시려면 헤더나 컨텐츠 내용을 실시간으로 분석해서 처리하시면 됩니다.
curl extension을 쓰셔도 쉽게 푸실 수 있습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.