[PHP] Meerdere URL's tegelijk downloaden

Pagina: 1
Acties:

Onderwerpen


  • BKJ
  • Registratie: April 2000
  • Laatst online: 18-09 14:52
Er draait hier een webapplicatie die het volgende doet:

- haal data op van locatie x
- verwerk data
- haal data op van locatie y
- verwerk data
- haal data op van locatie z
- verwerk data
- verwerk alle data

Nu kan het zo zijn dat y bijvoorbeeld traag reageert. Is het mogelijk om alle drie tegelijk op te halen en dan pas de data te verwerken? Een soort van mulithread dus zodanig dat je dus drie functies tegelijk start. Volgens mij bespaart dit erg veel tijd.

Heb gekeken naar curl_multi_exec maar dit is niet wat ik wil geloof ik...

Kamer huren


  • Icelus
  • Registratie: Januari 2004
  • Niet online
curl_multi_exec zou inderdaad meerdere URLs parallel af moeten handelen.

Je kunt ook nog naar pcntl_fork kunnen kijken.

Developer Accused Of Unreadable Code Refuses To Comment


Acties:
  • 0 Henk 'm!

Verwijderd

curl is volgensmij sowiezo treaded in dat de hele download in een aparte tread op de achtergrond gebeurt. curl_multi_exec is niks meer dan een groep van curl_exec's.

je zit dus eigenlijk met de vraag of je de download's zelf wilt doen of een module dit voor je laten doen. curl is opzich hier ideaal voor tenzij het niet gaat om HTTP en/of FTP downloads want meer protocollen spreekt curl volgensmij niet. hoewel curl een beetje onlogisch lijkt op het eerst gezicht is het eigenlijk vrij simple. je maak een curl-resource. set de nodige opties en voert hem uit met curl_exec. curl gaat dan in de achtergrond het bestand downloaden en jij hoeft alleen maar te checken of curl al klaar is of niet.

het alternatief is dat je zelf via bv file_get_contents() de file download met de bijbehorende stream-wrapper maar dat betekent dat je programma stop todat file_get_contents() klaar is. daarnaast komt dan ook het hele bestand in het geheugen te staan en dat is soms niet wenselijk met grote bestanden. of je doet het stap voor stap door met fopen() de resource te openen en met fread() het stukje voor stukje inleest en meteen wegschrijft naar een bestand met fwrite(). voordeel hiervan is dat je feitelijk elk protocol zou kunnen inbouwen door je eigen stream-wrapper class te schrijven en bijvoorbeeld zelfs van bittorent of usenet zou kunnen lezen.

dus kortom, als het een http of ftp resource betreft is cURL zeker aan te raden anders zou ik voor fopen() met een stream-wrapper gaan en dan gewoon functie maken die eens in de zoveel tijd aanroept die bijvoorbeeld 128bytes inleest, wegschrijft en terugkeert. je kunt dan zelf de snelheid bepalen want php leest geloof ik maximaal 8kb in een buffer en fread() leest de buffer weer dus als de buffer vol zit dan stop php automatisch todat er weer ruimte is en de uitvoer van je programma gaat gewoon verder want dit alles gebeurt in een aparte tread net zoals cURL dat doet.