Functie
Deze set objecten maakt het mogelijk om de voordelen die multithreading biedt te gebruiken in php.
Uitleg
Een uitgebreide uitleg over de achtergronden van deze manier van multithreaden heb ik in een tutorial verwerkt:
multithreading strategie. Heel simpel gezegd worden de classes die van Thread afstammen als threads gebruikt en kunnen deze eenvoudig worden beheerd door gebruik te maken van de verschillende classes die van ThreadManager afstammen.
Gebruik
Het gebruik van de multithreader wordt duidelijk uit de voorbeelden die bij het script zijn gevoegd. In de constructor en bij het aanroepen van bepaalde functies kan een array met configuratie opties worden meegegeven:
Overzicht van alle gebruikte configuratie opties.
De ‘file’ optie voor Process- en HttpThread en de ‘url’ optie voor CurlThread (afgeleide) classes zijn heel belangrijk. Standaard wordt aangenomen dat het script zichzelf moet openen als er niets wordt opgegeven. Deze zelfaanvragen moeten worden afgehandeld door de bijbehorende Thread::activate() functie aan te roepen. Zie hiervoor de voorbeelden.
Als er bij ProcessThreads geen ‘php’ optie wordt meegegeven, gaat het script er van uit dat deze al in het PATH is opgegeven. Als de ‘class’ niet wordt opgegeven wordt er vanuit gegaan dat de bij ‘function’ opgegeven functie niet in een class staat. Bij de int en float waarden betekent een null waarde steeds oneindig, dat wil zeggen dat deze optie niet als beperkende factor zal worden gebruikt.
Bij de ThreadManager mode optie moeten de constanten ThreadManager::RUN_START en ThreadManager::RUN_WAIT worden gebruikt. Een aantal functies maakt geen gebruik van een configuratie array, maar van een los argument of class constanten als argument. In de code staat steeds duidelijk aangegeven welke configuratie opties wanneer van toepassing zijn en hoe de functies moeten worden aangeroepen. Vaak hoeven maar enkele opties expliciet te worden meegegeven omdat standaardwaardes voor de meeste opties al in de code staan gedefinieerd.
Bij het aanroepen van een aantal ThreadManager functies kan een reference variabele worden meegegeven. Deze zal dan worden gevuld met relevante functie resultaten zoals het aantal gestarte en beëindigde Threads. Nuttige toepassingen hiervan staan in de voorbeelden.
Todo
De CurlThread en CurlThreadManager werken op zich goed, maar er zit soms een onverklaarbare vertraging in het starten en het wachten op resultaten. Ik ken de interne werking van curl niet exact, maar ik vermoed dat het daar iets mee te maken heeft. Dit is een belangrijk verbeterpunt. Andere verbeterpunten en mogelijke uitbereidingen staan in de code aangegeven.
Update
09/12/2009
Communicatiefout verholpen bij het versturen van grote hoeveelheden gegevens in de FunctionThreads. Apache verstuurde de gegevens in chunks als het boven een bepaalde grens was en van te voren niet precies wist hoeveel. Door de Content-Length header mee te geven gaat het nu goed.
12/12/2009
Voorbeeld 7 toegevoegd.
13/12/2009
Voorbeeld 8 toegevoegd.