[PHP] fopen() timeout *

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
( PHP ) <- vergeten in de topic titel te zetten. Excuus

Beste mede-tweakers,

Ik ben bezig met het maken van een zoekmachine. Natuurlijk moet deze zoekmachine op een of andere manier een database vullen en daarvoor heb ik een php script gemaakt. Deze haalt pagina's binnen met fopen() en gaat deze nakijken op bijvoorbeeld de body, meta tags enzovoort.

Het punt nu is het feit dat hij bij alle pagina's (30.048) ongeveer 0,.. seconden bezig is maar dat er een paar uitsteken met extreme tijden zoals 188 seconden. Kan ik op een of andere manier de tijd afvangen dat fopen over zijn bewerking doet? Of kan ik hem een timeout meegeven op een of andere manier?

De code is gewoon in simpele vorm:
PHP:
1
$webcontent = @fopen($webpagina['url'],"r");


Hierna vang ik natuurlijk af of fopen() gelukt is en als dat zo is mag hij beginnen met het indexeren van de pagina. Als dat niet het geval is springt hij gewoon verder naar de volgende url in de spider database.

Ik krijg geen errors en geen warnings (natuurlijk in dit geval door de @ voor de functie maar zonder ook geen)

Alvast bedankt,

Michel

[ Voor 5% gewijzigd door Verwijderd op 11-05-2004 12:52 . Reden: zie eerste regel ]


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Misschien kan de stream_set_timeout()-functie je helpen?

In het example wordt hij gebruikt NA de verbinding tot stand is gekomen, maar wellicht werkt het ook BIJ het tot stand komen :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
dat werkte niet echt :( Althans ik zie nog steeds resultaten die bijvoorbeeld langer dan >100 seconden duurden. Ik wil het nu met fsockopen() proberen maar die geeft meteen 2 soorten errors :(

1. Warning: fsockopen(): unable to connect to http://www.shirtshop.nl:80
2. Warning: fsockopen(): php_network_getaddresses: getaddrinfo failed: Name or service not known


Iemand een idee?

PHP:
1
$webcontent = fsockopen($webpagina['url'], 80, $errno, $errstr, 30);

Acties:
  • 0 Henk 'm!

  • Kwai_gon_jinn
  • Registratie: Januari 2001
  • Niet online

Kwai_gon_jinn

[-geen icon-]

wat staat er in :?
PHP:
1
$webpagina['url'];


anders dit maar eens proberen ?
PHP:
1
2
3
4
5
6
7
8
9
/**
 * open verbinding
 */
$webpagina["url"] = "www.tweakers.net";
$webconent = fsockopen (gethostbyname($webpagina["url"]), 80, $errno, $errstr, 30);

/**
  * rest van je PHP meuk
  */


Dan nog de code om de desbetreffende pagina te "cachen", maar dat is aan jou om uit te puzzelen :7

Confucius said: "In ancient time, learning was for self. Nowadays learning is for others."


Acties:
  • 0 Henk 'm!

  • Cavalera125
  • Registratie: December 2003
  • Laatst online: 21-09 11:15
Is het probleem dat je pagina's die er zolang over doen gewoon over wilt slaan? Of is het probleem dat je een script timeout krijgt omdat hij er zolang over doet? In het laatste geval zou je eens kunnen kijken naar http://nl3.php.net/manual/en/function.set-time-limit.php

Werkt echter alleen als safe-mode uit staat.

Acties:
  • 0 Henk 'm!

Verwijderd

Als je nou naar de grootte van het bestand kijkt, kan je daar niet info uit halen?
En na de pagina geindexeerd te hebben kan je de pagina ook een refresh geven, zodat je timeout teller weer opnieuw begint.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 21-09 22:43
Het probleem met PHP's tijdsbeperkingen is dat PHP ze pas forceert als er daadwerkelijk PHP code wordt uitgevoerd. Als de timeout verstrijkt bij het uitvoeren van een built-in functie (zoals hier het geval is) dan blijft het script gewoon draaien totdat de eerstvolgende regel PHP code uitgevoerd gaat worden. De suggestie van Cavalera werkt daarom niet.

Voor zover ik weet kun je geen tijdsbeperkingen instellen op de fopen-wrapper. Je kunt dan beter handmatig verbinden met fsockopen, maar dan moet je wel handmatig de HTTP requests uitvoeren. Je kunt er dus niet zomaar een URL in knikkeren zoals je nu doet. Kwai_gon_jinn geeft je al een flinke zet in de goede richting; op de PHP manual pages staat ook een voorbeeld van een simpele HTTP request met PHP sockets (en in de user notes staat nog veel meer bruikbare info).
Pagina: 1