Asynchroon downloaden met PHP?

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • stategamer
  • Registratie: December 2007
  • Laatst online: 12-07 08:42
Hallo Tweakers,

De laatste tijd ben ik bezig geweest met een script dat bestanden binnen haalt van een externe website.
Op die pagina waarnaar ik CURL staan allemaal links (in dit geval links naar plaatjes).
Deze links haal ik op, en sla de plaatjes op, zodat ik deze kan gebruiken op mijn server.
Nu verschilt het aantal links nogal, dit varieert van 5-10 tot zelfs 50-100 links.

Zoals je misschien al begrijpt kan dit nogal lang duren, als ik steeds moet wachten tot een plaatje klaar is, en dan pas naar het volgende plaatje gaat om deze te verwerken.

Dus ben ik een beetje gaan Googelen naar een oplossing, en dit is blijkbaar "Asynchroon downloaden".
Alleen kan ik hier geen goeie voorbeelden over vinden, is het wel mogelijk?

Thanks!

Edit: Wat ik dus wil bereiken is dat meerdere bestanden(plaatjes) tegelijkertijd worden gedownload.

[ Voor 8% gewijzigd door stategamer op 03-05-2011 17:06 ]


Acties:
  • 0 Henk 'm!

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

Je wilt dus meerdere dingen tegelijk doen, ook wel multithreading genaamt.

Eitje in Java/.Net, maar als ik 't even google voor PHP lijkt het niet (direct) mogelijk?

/edit
kwam nog dit stukje tegen over php, curl & multithreading
<...>
Curl offers the "multi" functions for retrieving content from several url's at the same time
<...>
Ziet eruit als wat je nodig hebt toch?

[ Voor 52% gewijzigd door J2pc op 03-05-2011 17:15 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
J2pc schreef op dinsdag 03 mei 2011 @ 17:13:
Ziet eruit als wat je nodig hebt toch?
Zonder de docs erop nageslagen te hebben: AFAIK (en wat ik uit het voorbeeld haal) moet je dan nog altijd wachten tot alle requests compleet zijn voor je script verder gaat.

Dit lijkt me meer een taak voor een cronjob oid.
stategamer schreef op dinsdag 03 mei 2011 @ 17:03:
Zoals je misschien al begrijpt kan dit nogal lang duren, als ik steeds moet wachten tot een plaatje klaar is, en dan pas naar het volgende plaatje gaat om deze te verwerken.
...
Edit: Wat ik dus wil bereiken is dat meerdere bestanden(plaatjes) tegelijkertijd worden gedownload.
Het zal hoe dan ook "lang" blijven duren. Een aantal a-synchrone requests zal 't proces wel versnellen maar 50-100 plaatjes downloaden zal nooit "in een flits" gaan.

[ Voor 47% gewijzigd door RobIII op 03-05-2011 17:28 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • u_nix_we_all
  • Registratie: Augustus 2002
  • Niet online
Kun je vanuit PHP curl niet in de achtergrond uitvoeren ? (dus met een & erachter als het shell-scripting zou zijn). Kun je direct weer verder....

You don't need a parachute to go skydiving. You need a parachute to go skydiving twice.


Acties:
  • 0 Henk 'm!

  • J2pc
  • Registratie: Oktober 2002
  • Niet online

J2pc

UT Tux Edition

RobIII schreef op dinsdag 03 mei 2011 @ 17:24:
[...]

Zonder de docs erop nageslagen te hebben: AFAIK (en wat ik uit het voorbeeld haal) moet je dan nog altijd wachten tot alle requests compleet zijn voor je script verder gaat.

Dit lijkt me meer een taak voor een cronjob oid.


[...]

Het zal hoe dan ook "lang" blijven duren. Een aantal a-synchrone requests zal 't proces wel versnellen maar 50-100 plaatjes downloaden zal nooit "in een flits" gaan.
Ik had niet het idee dat dat het probleem was.
Meer dat het 'zonde' is om slechts 1 request tegelijk te doen. Volgens mij is het gewoon een eigen 'tooltje' om pics te rippen. Maakt dan niet zoveel uit dat die request blijft lopen toch?

Zelf zou ik gewoon een .net/java appje maken ipv een webserver hiervoor te 'misbruiken' O-)

Anyway, TS, kan je wat met de gegeven opties? Zitten we in de richting van wat je wilt?

[ Voor 5% gewijzigd door J2pc op 03-05-2011 17:38 ]

"The computer is incredibly fast, accurate, and stupid. Man is unbelievably slow, inaccurate, and brilliant. The marriage of the two is a challenge and opportunity beyond imagination." © Stuart G. Walesh


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
J2pc schreef op dinsdag 03 mei 2011 @ 17:37:
[...]

Ik had niet het idee dat dat het probleem was.
Meer dat het 'zonde' is om slechts 1 request tegelijk te doen. Volgens mij is het gewoon een eigen 'tooltje' om pics te rippen. Maakt dan niet zoveel uit dat die request blijft lopen toch?
Ik twijfelde, na mijn post, ook over wat nu de eigenlijke bedoeling was ;)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ReenL
  • Registratie: Augustus 2010
  • Laatst online: 14-09-2022
Process Control support in PHP implements the Unix style of process creation, program execution, signal handling and process termination. Process Control should not be enabled within a web server environment and unexpected results may happen if any Process Control functions are used within a web server environment.
Handig voor de CLI, niet handig over http :)

Zie:
http://nl.php.net/manual/en/intro.pcntl.php

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Nu online
Google stikt van de resultaten als je zoekt op 'cURL asynchronous'. Als ik eerlijk mag zijn heb ik niet het geval dat je zelf al aan het zoeken bent geweest en dat je een kant-en-klare oplossing zoekt.

Zie bijvoorbeeld deze blogpost: http://www.jaisenmathai.c...hp-curl-asynchronous.html

Acties:
  • 0 Henk 'm!

  • ufear
  • Registratie: December 2002
  • Laatst online: 11:50
Je kan cURL zeker meerdere dingen tegelijk laten ophalen; even uit wat oude code getrokken. Geeft je iig een idee.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
foreach ($array as $n => $url)
    $ch[$n] = curl_init();
    curl_setopt ($ch[$n], CURLOPT_URL, $url);
    curl_setopt ($ch[$n], CURLOPT_HEADER, 0);
    curl_setopt ($ch[$n], CURLOPT_RETURNTRANSFER, TRUE);
}

$mh = curl_multi_init();    
foreach ($array as $n => $val) {            
    curl_multi_add_handle($mh,$ch[$n]);
}       
do {
 curl_multi_exec($mh,$running);
} while ($running > 0);

foreach ($array as $n => $val) {
    $data = curl_multi_getcontent($ch[$n]);
}


Beetje in gekloot om te posten, dus werking niet getest, maar dit is de strekking die ik gebruikte, werkte prima (draaide 10-15 requests tegelijk).

Acties:
  • 0 Henk 'm!

  • stategamer
  • Registratie: December 2007
  • Laatst online: 12-07 08:42
@ alle heren, die twijfelen, ik krijg van een externe partij de links aangeboden om deze (plaatjes) op te kunnen slaan en te verwerken / gebruiken (hiervoor word betaald).

De rest, die antwoorden heeft gepost, ga ik eens rustig bekijken, ik denk dat die CURL_MULTI wel een optie zou kunnen zijn ( even snel gekeken).
J2pc schreef op dinsdag 03 mei 2011 @ 17:37:
[...]

Ik had niet het idee dat dat het probleem was.
Meer dat het 'zonde' is om slechts 1 request tegelijk te doen. Volgens mij is het gewoon een eigen 'tooltje' om pics te rippen. Maakt dan niet zoveel uit dat die request blijft lopen toch?

Zelf zou ik gewoon een .net/java appje maken ipv een webserver hiervoor te 'misbruiken' O-)
Het gaat hier inderdaad over de slechts 1 request tegelijk, ik zou er als het kan, het liefst zou ik er 5 tegelijk willen doen ( 5 fwrites tegelijk? :D)

Bedankt heren!

[ Voor 55% gewijzigd door stategamer op 03-05-2011 18:02 ]


Acties:
  • 0 Henk 'm!

  • fleppuhstein
  • Registratie: Januari 2002
  • Laatst online: 24-06 15:50
Zolang je het niet los koppelt van je script, zal het altijd synchroon blijven. Immers wordt er gewacht tot alles voltooid is. Zelfs met de CURL_MULTI, dat zijn meerdere downloads, wellicht meerdere tegelijkertijd, maar nog steeds synchroon.

Wat eerder is geroepen cronjob klinkt als een goede oplossing. Echter is het misschien beter om het downloaden van een enkele afbeelding als losstaande taak uit te programmeren. Hierdoor kan je zelf wel door gaan met je script, en wordt er wel direct uitgevoerd. Vervolgens kan je later via AJAX de plaatjes later inladen.

Op het moment dat je de download triggered kan je al een unieke bestandsnaam toewijzen.

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-07 16:49
je zou ook het script kunnen forken en zo meerdere scripts tegelijk kunnen runnen
http://nl.php.net/manual/en/function.pcntl-fork.php

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Nu online
dragontje124 schreef op dinsdag 03 mei 2011 @ 20:39:
je zou ook het script kunnen forken en zo meerdere scripts tegelijk kunnen runnen
http://nl.php.net/manual/en/function.pcntl-fork.php
Of als dat te lastig blijkt te zijn: http://pear.php.net/package/System_Daemon

Acties:
  • 0 Henk 'm!

Anoniem: 35775

Ik heb weleens vergelijkbare tools geschreven en vond de curl multi options aanvankelijk goed werken maar een PHP script continu laten draaien is alles behalve ideaal gebleken.

Ik veel gevallen heb ik in Perl een daemon geschreven die niets meer doet dan een queue doorlopen en dan een aantal losse php threads opstart.

Dit is eigenlijk zo simpel dat er weinig fout kan gaan en mocht er een thread een keer op zijn bek gaan zal dit verder geen impact op de rest van de threads of de continuiteit hebben.

Natuurlijk is het wel handig om bij te houden welke processen lopen (PID's) en wanneer ze gestart zijn zodat eventuele hangende threads gekilled kunnen worden.

Acties:
  • 0 Henk 'm!

  • dragontje124
  • Registratie: Mei 2009
  • Laatst online: 07-07 16:49
maar dan ga je er vanuit dat hij op een Linux systeem werkt

Acties:
  • 0 Henk 'm!

  • storeman
  • Registratie: April 2004
  • Laatst online: 12:17
Ik moest net met iets vergelijkbaars aan de slag. Ik heb het op kunnen lossen met cURL, werkt prima, bedankt allen!

"Chaos kan niet uit de hand lopen"


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Maak een cronjobje dat een scriptje start dat een openstaande opdracht kan oppikken en wellicht meerdere keren tegelijk kan draaien en KISS verder.

{signature}


Acties:
  • 0 Henk 'm!

  • Y0ur1
  • Registratie: Oktober 2000
  • Niet online
Wil je de plaatjes pas ophalen nalv. een user actie op je site? Zo ja dan kun je een message queue gebruiken.
Wil je het constant plaatjes ophalen dan zou ik gaan voor een cron job.
Dit zijn de meest eenvoudige oplossingen, php processen forken of zelf starten vanuit php lijkt me geen ideale oplossing simpelweg omdat PHP hier eigenlijk niet voor gemaakt is, oke het kan maar het is niet ideaal.

Acties:
  • 0 Henk 'm!

  • Manuel
  • Registratie: Maart 2008
  • Nu online
dragontje124 schreef op dinsdag 03 mei 2011 @ 23:14:
[...]

maar dan ga je er vanuit dat hij op een Linux systeem werkt
Een daemon op Windows heet daar een service, wat wel meer werk is. Maar zo te zien heeft TS het probleem opgelost met cURL.
Pagina: 1