Сокеты вешают скрипт

~AquaZ~

Новичок
sock.php
PHP:
<form action="sock.php" method="post">
  <input type="text" name="host" value="<?php if (!empty($_POST['host'])) echo $_POST['host']; else echo 'host';?>" /><br/>
  <textarea name="request" cols="64" rows="16"><?php if (!empty($_POST['request'])) echo $_POST['request'];?></textarea><br/>
  <input type="submit" value="SockIt!" />
</form>

<?php
if (!empty($_POST))
    echo '<fieldset id="request"><legend>'.$_POST['host'].'</legend>'.$_POST['request'].'</fieldset><code id="answer">'.sock_get($_POST['host'], $_POST['request']).'</code>';

function sock_get($host, $request)
{
    $line = '';
    $fp = fsockopen($host, 80, $errno, $errstr, 30);
    if (!$fp)
        return '<code id="error">#'.$errno.': '.$errstr.'</code>';
    fwrite($fp, $request);
    $line = '';
    while (!feof($fp))
        $line .= fgetc($fp); //$line .= fgets($fp, 1024); //оба варианта висят тут
    fclose($fp);
    if (empty($line)) $line = '[ empty ]';
    return $line;
}
?>

</body>
Почему он висит!??
P.S. Знаю, что скрипт небезопасен. Делаю для себя.
 

tz-lom

Продвинутый новичок
Сокеты есть блокирующие и не блокирующие.
Блокирующий ждёт появления данных, не блокирующий проскакивает если данных ещё не пришло.
У тебя блокирующий. Скрипт не висит а ждёт, вроде бы даже есть таймаут на соединение, но он довольно большой.
 

tz-lom

Продвинутый новичок
feof($fp)
будет true когда разорвётся соединение, в твоём случае - когда его разорвёт хост
 

~AquaZ~

Новичок
Но чё-то хост vk.com не разрывает соединение. Запрос:
Код:
GET /js/al/photos_add.js?14 HTTP/1.1
Host: vk.com
Connection: close
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.2 (KHTML, like Gecko) Chrome/15.0.874.121 Safari/535.2
Accept: */*
Referer: http://vk.com/album38758185_139608405?act=add
Accept-Language: ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4
Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.3
Cookie: тут были куки
 

tz-lom

Продвинутый новичок
Может терпения не хватает?
P.S.
вообще есть curl , если тебе интересно сделать всё самому - так и делай сам, в интернете полно информации как такое навелосипедить, на проблемы я указал, а дальше сам рой что это значит и как это лечится.
 

~AquaZ~

Новичок
Терпения должно хватать. Браузер грузит аналогичную страницу меньше секунды, а скрипт - "over 9000". А CURL чё-то не люблю.
 

tz-lom

Продвинутый новичок
по стандарту - сервер не разрывает соединение после отправки ответа, это делает клиент, поэтому нужно прочитать сколько есть и самому рвать соединение
сервак же разорвёт соединение через значительный промежуток времени, а может и вообще не разорвать, но это-косяк
 
Сверху