Avatar billede Strawberry Seniormester
29. januar 2026 - 13:08 Der er 17 kommentarer og
1 løsning

Bruge PHP til at hente hjemmeside med fsockopen

Jeg vil gerne udskifte host med en variabel, men får fejl.

Dette virker:

$fp = fsockopen("ssl://www.dr.dk", 443, $errno, $errstr, 30);


Men dette virker ikke:

$host = "www.dr.dk";
$fp = fsockopen("ssl://".$host, 443, $errno, $errstr, 30);


Hvordan kan jeg få det til at virke?
Avatar billede arne_v Ekspert
29. januar 2026 - 13:30 #1
Der burde ikke være nogen forskel på de to.

Er koden copy pastet? Hvilken fejl får du med den kode som ikke virker?
Avatar billede arne_v Ekspert
29. januar 2026 - 13:30 #2
Og noget helt andet: hvorfor bruger du fsockopen og ikke bare file_get_contents eller curl?
Avatar billede Strawberry Seniormester
29. januar 2026 - 13:46 #3
Jeg får fejlen:

HTTP/1.1 301 Moved Permanently

I stedet for at få:

HTTP/1.1 200 OK

Og jeg har ikke ændret andet i koden end de nævnte linjer.
Avatar billede Strawberry Seniormester
29. januar 2026 - 14:02 #4
Ja det er noget kode jeg har copy/pastet.

Jeg bruger fsockopen fordi der kan jeg bruge følgende til, at kontrollere om siden/filen stadigvæk eksisterer:

$out = "HEAD /".$path." HTTP/1.1\r\n";


Jeg kan også vælge at bruge:
$out = "GET /".$path." HTTP/1.1\r\n";


Jeg har forsøgt med at bruge følgende, men det er ikke altid den virker:
$headers = @get_headers($url);
Avatar billede Strawberry Seniormester
29. januar 2026 - 15:12 #5
Jeg har fået det til at virke.

Det virkede åbenbart ikke fordi jeg havde lavet denne if-sætning:

if ($type = "http") {
$fp = fsockopen("".$host, 80, $errno, $errstr, 30);
}
else if ($type = "https") {
$fp = fsockopen("ssl://".$host, 443, $errno, $errstr, 30);
}


Nu har jeg ændret det til følgende kode, og så virker det:

if ($type == "https") {
$ssl = "ssl://".$host;
$port = 443;
}
else if ($type == "http") {
$ssl = $host;
$port = 80;
}

$fp = fsockopen($ssl, $port, $errno, $errstr, 30);
Avatar billede arne_v Ekspert
29. januar 2026 - 15:22 #6
Ah. Klassisk = vs ==.

Der er dem som anbefaler fremfor:

if ($type == "https") {

at bruge:

if ("https" == $type) {

fordi så kan man ikke komme til at bruge =.
Avatar billede arne_v Ekspert
29. januar 2026 - 15:23 #7
Curl giver fin kontrol over headere og fejl status.
Avatar billede Strawberry Seniormester
30. januar 2026 - 17:38 #8
Mange tak for dine svar. Jeg så først at jeg var kommet til at skrive = i stedet for == da jeg postede det her på siden.

Jeg tror jeg holder mig til fsockopen, det kan jeg bedre finde ud af og det giver nogle flere muligheder. Blandt andet mulighed for at følge med i redirections og vælge max antal redirections. Og jeg kan ikke lige umiddelbart se om der er muligt kun at hente HEAD, hvis jeg bruger curl. Og nu har jeg fået det til at virke med fsockopen, så jeg kan ikke se nogen grund til at bruge andet.
Avatar billede Strawberry Seniormester
30. januar 2026 - 18:23 #9
Jeg fandt lige noget kode på nettet, så det ser ud til at curl også kan bruges:


  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, "https://dmi.dk");
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (bot / crawler)");
  curl_setopt($curl, CURLOPT_HTTPHEADER, ['Accept-Language: da']);
  curl_setopt($curl, CURLOPT_HTTPHEADER, ['Referer: https://www.dr.dk']);
  curl_setopt($curl, CURLOPT_HEADER, true);
  curl_setopt($curl, CURLOPT_FILETIME, true);
  curl_setopt($curl, CURLOPT_NOBODY, true);
  $header = curl_exec($curl);
  //curl_getinfo($header);
  curl_close($curl);
  echo $header;

  echo "<br><br>";

  $curl = curl_init();
  curl_setopt($curl, CURLOPT_URL, "https://cvr.dk");
  curl_setopt($curl, CURLOPT_USERAGENT, "Mozilla/5.0 (bot / crawler)");
  curl_setopt($curl, CURLOPT_HTTPHEADER, ['Accept-Language: da']);
  curl_setopt($curl, CURLOPT_HTTPHEADER, ['Referer: https://www.dr.dk']);
  curl_setopt($curl, CURLOPT_HEADER, true);
  curl_setopt($curl, CURLOPT_FILETIME, true);
  curl_setopt($curl, CURLOPT_NOBODY, true);
  $header = curl_exec($curl);
  //curl_getinfo($header);
  curl_close($curl);
  echo $header;
Avatar billede arne_v Ekspert
30. januar 2026 - 18:42 #10
Jep.

Den lidt kryptiske:

curl_setopt($curl, CURLOPT_NOBODY, true);

gør at curl sender en HEAD request.
Avatar billede arne_v Ekspert
30. januar 2026 - 18:45 #11
Generelt er curl ofte lidt kryptisk.

libcurl er et C library som er blevet wrappet i PHP men stadig er "C stil".

Imidlertid er det også et meget professionelt library, så du kan godt regne med at det kan næsten alt og ikke har mange fejl.
Avatar billede Strawberry Seniormester
31. januar 2026 - 08:46 #12
Det undre mig at følgende sider giver 404 Not Found. Er det virkelig fordi de har fejl på deres hjemmeside?

https://www.msn.com/da-dk
https://www.danskindustri.dk

Og hvordan kan det være at mange hjemmesider giver resultatet 403 Forbidden?
Avatar billede erikjacobsen Ekspert
31. januar 2026 - 14:37 #13
Hvis du henter en webside uden angivelse af en User-Agent header, altså en angivelse af hvilken browser du bruger, så er der sider der afviser dig med et "Nej, ellers tak". De har regnet ud du er en slags bot.

Man kan snyde og angive en vilkårlig browser, men så kan der være andre kontroller.
Avatar billede Strawberry Seniormester
31. januar 2026 - 23:14 #14
@erikjacobsen:

Jeg tror du har ret i, at der er forskel på mit PHP script og om man bruger en internet browser. Det ser dog ikke ud til at det er User-Agent headeren, der er problemet. Jeg har prøvet at ændre så headeren er den samme, som internet browseren sender og det gav samme resultat.

Jeg har fundet ud af at jeg kan hente headeren med følgende kode:

<?php
$url = "http://danskonlineindex.dk/";
$url = "https://www.msn.com/da-dk";
$url = "http://msn.dk";

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: da\r\n" .
              "Referer: https://www.dr.dk\r\n" .
              "User-Agent: Mozilla/5.0 (compatible; bot / crawler)\r\n"));

$context = stream_context_create($options);

// read all
//$http = @file_get_contents($url,false,$context);

// read only header
$http = @file_get_contents($url,false,$context,0,0);

  // For PHP >= 8.4.0
  if (function_exists('http_get_last_response_headers')) {
    $headers = http_get_last_response_headers();
  }
  else {
    $headers = $http_response_header;
  }

echo "<pre>";

print_r($headers);

echo "</pre>";

echo "<hr size=1>";

echo htmlencode($http);

function htmlencode($str_text) {
  $tmp_text = str_replace("<", "&lt;","".$str_text);
  $tmp_text = str_replace(">", "&gt;","".$tmp_text);
  return $tmp_text;
}
?>
Avatar billede arne_v Ekspert
Skrevet i går kl. 01:04 #15
Den UA er ikke ægte browser.

Min FF sender f.eks.:

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:147.0) Gecko/20100101 Firefox/147.0
Avatar billede arne_v Ekspert
Skrevet i går kl. 01:04 #16
Check også om der bliver sent en Host header automatisk. Hvis ikke skal du have tilføjet den.
Avatar billede Strawberry Seniormester
Skrevet i dag kl. 09:42 #17
@arne_v:

Jeg er gået over til at bruge file_get_contents så der kan man ikke angive host i headeren automatisk. Der angiver man kun url, uden mulighed for at indtaste host.
Avatar billede erikjacobsen Ekspert
Skrevet i dag kl. 10:29 #18
file_get_contents sender da hostheader med automatisk, og du kan tilføje flere HTTP-headers:

<?php

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad
  )
);

$context = stream_context_create($options);
$file = file_get_contents('https://somefunnydomain.dk/', false, $context);
print($file);
?>
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester