Показать сообщение отдельно

  #9  
Старый 12.09.2007, 13:31
Аватар для groundhog
groundhog
Познавший АНТИЧАТ
Регистрация: 12.05.2007
Сообщений: 1,235
Провел на форуме:
2238549

Репутация: 1318


Отправить сообщение для groundhog с помощью ICQ
По умолчанию

ant0ha, вот фигли он будет в переменной? Про параметр CURLOPT_RETURNTRANSFER слышали? Вот только после его инициализации будет возвращён результат в переменную...

Жись_Гавно, а ты можешь воспользоваться функцией, которая реализует транспорт через либу CURL (писал для себя, поддерживается множество методов). Вот исходник (форматирование поехало, но всё равно разберёшься):

PHP код:
define("HTTP_GET",     0x0001);
define("HTTP_POST",     0x0002);
define("HTTP_HEAD",     0x0003);
define("HTTP_PUT",      0x0004);
define("HTTP_DELETE",   0x0006);
define("HTTP_TRACE",    0x0007);
define("HTTP_OPTIONS",  0x0008);
define("HTTP_PROPFIND"0x0009);

define("HTTP_10",       0x0001);
define("HTTP_11",       0x0002);


function 
httpRequest (
$requestMethod,   // HTTP метода - одна из определённых выше констант
$requestVersion,   // HTTP версия - одна из определённых выше констант
$requestUrl,   // Урла запроса
$requestHeaders,   // Хидеры запроса
$requestBody,   // Тело запроса
$requestTimeout,   // Таймаут-запроса
$requestProxy,   // Прокси для соединения
&$responseCode null,   // Переменная, куда будет возвращён HTTP код ответа
&$responseHeaders null,   // Переменная куда будет возвращены хидеры ответа
&$responseBody null,   // Переменная куда будет возвращено тело запроса
&$errCode null,   // Номер ошибки CURL
&$errString null)   // Описание ошибки CURL
{
        if (!
is_integer($requestTimeout))
            return (
$responseCode $responseHeaders $responseContent false);

        
$urlData parse_url($requestUrl);

        if (!isset(
$urlData["host"]))
            return (
$responseCode $responseHeaders $responseContent false);

        if (!isset(
$urlData["scheme"])) $urlData["scheme"] = "http";
        if (!isset(
$urlData["path"])) $urlData["path"] = "/";
        if (!isset(
$urlData["port"]) && $urlData["scheme"] == "http"$urlData["port"] = 80;
        if (!isset(
$urlData["port"]) && $urlData["scheme"] == "https"$urlData["port"] = 443;

        switch (
$requestMethod) {
            case 
HTTP_GET :
                
$httpMethod "GET";
            break;

            case 
HTTP_POST :
                
$httpMethod "POST";
            break;

            case 
HTTP_HEAD :
                
$httpMethod "HEAD";
            break;

            case 
HTTP_PUT :
                
$httpMethod "PUT";
            break;

            case 
HTTP_DELETE :
                
$httpMethod "DELETE";
            break;

            case 
HTTP_TRACE :
                
$httpMethod "TRACE";
            break;

            case 
HTTP_OPTIONS :
                
$httpMethod "OPTIONS";
            break;

            case 
HTTP_PROPFIND :
                
$httpMethod "PROPFIND";
            break;

            default :
                return (
$responseCode $responseHeaders $responseContent false);
            break;
        }

        switch (
$requestVersion) {
            case 
HTTP_10 :
                
$httpVersion "1.0";
            break;

            case 
HTTP_11 :
                
$httpVersion "1.1";
            break;

            default :
                return (
$responseCode $responseHeaders $responseContent false);
            break;
        }

        if (isset(
$urlData["query"]))
            
$customRequest  sprintf("%s %s?%s HTTP/%s\r\n"$httpMethod$urlData["path"], $urlData["query"], $httpVersion);
        else
            
$customRequest  sprintf("%s %s HTTP/%s\r\n"$httpMethod$urlData["path"], $httpVersion);

        
$customRequest .= sprintf("Host: %s\r\n"$urlData["host"]);

        foreach (
$requestHeaders as $header)
            
$customRequest .= sprintf("%s\r\n"$header);

        if (
$requestMethod == HTTP_POST || $requestMethod == HTTP_PUT)
            if (
strlen($requestBody) > 0$customRequest .= sprintf("Content-Length: %s\r\n"strlen($requestBody));
            else return (
$responseCode $responseHeaders $responseContent false);

        if (isset(
$urlData["user"]) && isset($urlData["pass"])) {
            
$authValue sprintf("%s:%s"$urlData["user"], $urlData["pass"]);
            
$customRequest .= sprintf("Authorization: Basic %s\r\n"base64_encode($authValue));
        }

        
$customRequest .= sprintf("Connection: close\r\n"$urlData["host"]);
        
$customRequest .= "\r\n";

        if (
$requestMethod == HTTP_POST || $requestMethod == HTTP_PUT)
            if (
strlen($requestBody) > 0$customRequest .= sprintf("%s"$requestBody);
            else return (
$responseCode $responseHeaders $responseContent false);

        
$curlHandler curl_init();

        
$curlOptions = array (
            
CURLOPT_URL                    =>    sprintf("%s://%s"$urlData["scheme"], $urlData["host"]),
            
CURLOPT_PORT                =>    $urlData["port"],
            
CURLOPT_TIMEOUT            =>    $requestTimeout,
            
CURLOPT_CUSTOMREQUEST    => $customRequest,
            
CURLOPT_FOLLOWLOCATION    => true,
            
CURLOPT_HEADER                => true,
            
CURLOPT_RETURNTRANSFER    => true,
            
CURLOPT_FAILONERROR        => false,
            
CURLOPT_VERBOSE            => false,
            
CURLOPT_NOPROGRESS        => true
        
);

        if (
$urlData["scheme"] == "https") {
            
$curlOptions[CURLOPT_SSL_VERIFYPEER] = false;
            
$curlOptions[CURLOPT_SSL_VERIFYHOST] = false;
        }

        if (
$requestMethod == HTTP_HEAD || $requestMethod == HTTP_OPTIONS || $requestMethod == HTTP_DELETE)
            
$curlOptions[CURLOPT_NOBODY] = true;
        else
            
$curlOptions[CURLOPT_NOBODY] = false;

        if (!
is_null($requestProxy)) {
            
$proxyData parse_url("http://" $requestProxy);

            if (isset(
$proxyData["user"]) && isset($proxyData["pass"]))
                
$curlOptions[CURLOPT_PROXYUSERPWD]    = sprintf("%s:%s"$proxyData["user"], $proxyData["pass"]);

            if (!isset(
$proxyData["host"]) && !isset($proxyData["port"]))
                return (
$responseCode $responseHeaders $responseContent false);

            
$curlOptions[CURLOPT_PROXY]                = sprintf("%s:%d"$proxyData["host"], $proxyData["port"]);
            
$curlOptions[CURLOPT_HTTPPROXYTUNNEL]    = sprintf("%s:%d"$proxyData["host"], $proxyData["port"]);
        }

        
$result curl_setopt_array($curlHandler$curlOptions);
        if (!
$result) return ($responseCode $responseHeaders $responseContent false);

        
$response curl_exec($curlHandler);

        
$errCode        curl_errno($curlHandler);
        
$errString    sprintf("Error: %s"curl_error($curlHandler));

        if (
curl_errno($curlHandler) != CURLE_OK) {
            
$responseCode        false;
            
$responseHeaders    false;
            
$responseContent    false;

            
curl_close($curlHandler);

            return 
false;
        }

        
curl_close($curlHandler);

        list(
$headers$responseBody) = preg_split("/\r\n\r\n/"$response2);

        
$headers                        preg_split("/\r\n/"$headers);
        list(,
$responseCode,)    = sscanf(array_shift($headers), "%s %d %s");

        
$responseHeaders    $headers;

        return 
true;
    } 
Ну или если ты любитель сокет, то вот пример, только для метода GET, но если ты знаешь принципы и спецификацию протокола HTTP, то реализовать другой метод тебе труда не составит:

PHP код:
        function httpGetRequest ($remoteUrl, &$respCode, &$respBody) {
            
$urlData parse_url($remoteUrl);

            if (!isset(
$urlData["host"])) return false;
            if (!isset(
$urlData["port"])) $urlData["port"] = 80;
            if (!isset(
$urlData["path"])) $urlData["path"] = "/";

            
$socket fsockopen($urlData["host"], $urlData["port"], $errno$errstr60);
            if (!
$socket) return false;

            
$resource $urlData["path"];
            if (isset(
$urlData["query"])) $resource .= "?{$urlData["query"]}";

            
$sendData  "GET {$resource} HTTP/1.1\r\n";
            
$sendData .= "Host: {$urlData["host"]}\r\n";
            
$sendData .= "User-Agent: DaMaGeLaB Crawler\r\n";
            
$sendData .= "Accept: */*\r\n";
            
$sendData .= "Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0\r\n";
            
$sendData .= "Pragma: no-cache";
            
$sendData .= "Connection: Close\r\n\r\n";

            
$ret fwrite($socket$sendData);
            if (!
$ret) return false;

            
$buffer "";
            while (!
feof($socket)) {
                
$buffer .= fgets($socket8192);
            }

            
fclose($socket);

            list(
$headers$content) = preg_split("/\r\n\r\n/"$buffer2);

            if (
strlen($content) <= || strlen($headers) <= 0) return false;

            
$respCode intval(substr($headers93));
            
$respBody $content;

            return 
true;
        } 
 
Ответить с цитированием