Улучшение HTTP GET PHP скриптов - PullRequest
0 голосов
/ 12 ноября 2009

Этот код получает заголовки и содержимое из $ url и распечатывает их в браузере. Это действительно медленно, и это не потому, что сервер. Как я могу улучшить это?

$headers = get_headers($url);

foreach ($headers as $value)
    header($value);

$fh = fopen($url, "r");
fpassthru($fh);

Спасибо

Ответы [ 5 ]

1 голос
/ 12 ноября 2009

Зачем делать два запроса, когда один будет делать?

$fh = fopen($url, 'r');
foreach ($http_response_header as $value) {
    header($value);
}
fpassthru($fh);

Или:

$content = file_get_contents($url);
foreach ($http_response_header as $value) {
    header($value);
}
echo $content;
0 голосов
/ 12 ноября 2009

Возможно, вы сможете точно определить медлительность, изменив $ url на быстро известный сайт или даже локальный веб-сервер. Единственное, что кажется возможным, - это медленный ответ от сервера.

Конечно, как предполагает GZipp, если вы собираетесь выводить и содержимое файла, просто сделайте это с помощью одного запроса. Это сделало бы сервер, который вы запрашиваете, счастливее.

0 голосов
/ 12 ноября 2009

Вы пытаетесь сделать прокси? Если это так, вот рецепт, в proxy.php:

<?php
$host = 'example.com';
$port = 80;

$page = $_SERVER['REQUEST_URI'];

$conn = fsockopen($host, $port, $errno, $errstr, 180);
if (!$conn) throw new Exception("$errstr ($errno)");

$hbase = array();
$hbase[] = 'User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)';
if (!empty($_SERVER['HTTP_REFERER'])) $hbase[] = 'Referer: '.str_ireplace($_SERVER['HTTP_HOST'], $host, $_SERVER['HTTP_REFERER']);
if (!empty($_SERVER['HTTP_COOKIE'])) $hbase[] = 'Cookie: '.$_SERVER['HTTP_COOKIE'];
$hbase = implode("\n", $hbase);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $post = file_get_contents("php://input");
    $length = strlen($post);
    $request = "POST $page HTTP/1.0\nHost: $host\n$hbase\nContent-Type: application/x-www-form-urlencoded\nContent-Length: $length\n\n$post";
} else $request = "GET $page HTTP/1.0\nHost: $host\n$hbase\n\n";

do {
    $conn = fsockopen($host, 80, $errno, $errstr, 180);
    if (!$conn) throw new Exception("$errstr ($errno)");

    fputs($conn, $request);

    $header = false;
    $body = false;

    stream_set_blocking($conn, false);
    $info = stream_get_meta_data($conn);
    while (!feof($conn) && !$info['timed_out']) {
        $str = fgets($conn);
        if (!$str) {
            usleep(50000);
            continue;
        }

        if ($body !== false) $body .= $str;
        else $header .= $str;

        if ($body === false && $str == "\r\n") $body = '';
        $info = stream_get_meta_data($conn);
    }
    fclose($conn);
} while ($info['timed_out']);

$header = str_ireplace($host, $_SERVER['HTTP_HOST'], $header);
if (stripos($body, $host) !== false) $body = str_ireplace($host, $_SERVER['HTTP_HOST'], $body);

$header = str_replace('domain=.example.com; ', '', $header);

$header_array = explode("\r\n", $header);
foreach ($header_array as $line) header($line);

if (strpos($header, 'Content-Type: text') !== false) {
    $body = str_replace('something', '', $body);
}

echo $body;

В .htaccess:

Options +FollowSymlinks

RewriteEngine on
RewriteBase /
RewriteRule ^(.*)$ proxy.php [QSA,L]
0 голосов
/ 12 ноября 2009

Если вы действительно хотите просто прокси-страницу, функции cURL гораздо эффективнее:

<?
  $curl = curl_init("http://www.google.com");
  curl_setopt($curl, CURLOPT_HEADER, true);
  curl_exec($curl);
  curl_close($curl);
?>

Конечно, cURL должен быть включен на вашем сервере, но это не редкость.

0 голосов
/ 12 ноября 2009

Я не уверен, почему вы открываете соединение там в строке 6, если у вас уже есть и распечатали заголовки. Это делает больше, чем распечатывает заголовки?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...