HTTP GET PHP betikleri geliştirin

5 Cevap php

Bu kod $ url başlıklarını ve içerik alma ve tarayıcıya basar. Bu gerçekten yavaş olduğunu ve sunucu için değil. Bunu nasıl artırabilir?

$headers = get_headers($url);

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

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

Teşekkürler

5 Cevap

Biri yapacak zaman neden iki isteklerini yapmak?

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

Veya:

$content = file_get_contents($url);
foreach ($http_response_header as $value) {
    header($value);
}
echo $content;

Ben zaten ve başlıklarını basılmış varsa neden hattında 6 orada bir bağlantı açma emin değilim. Bu başlıklarını baskı daha fazla yapıyor?

Eğer gerçekten sadece vekil bir sayfa arıyorsanız, cURL işlevlerinin çok daha verimli:

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

Tabii ki, cURL sunucu üzerinde etkin olması gerekiyor, ancak bu nadir değildir.

Eğer bir proxy yapmaya çalışıyorsun? Eğer öyleyse, burada proxy.php yılında, bir tarifi:

<?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]

Sen know hızlı siteye, hatta yerel bir web sunucusuna $ url değiştirerek yavaşlık saptayabilmiştir olabilir. Mümkün görünüyor tek şey sunucudan yavaş yanıttır.

Tabii olarak GZipp tarafından önerilen, siz de çıktı dosya içeriği için gidiyoruz eğer, sadece tek bir istek ile bunu. Yani mutlu gelen talep ediyoruz sunucu yapmak istiyorum.