"Natural Threading" is a one-of-a-kind multi-threading class for PHP that requires absolutely no root access and works on shared servers.
It uses a clever CURL hack to simulate multi-threading, you don't need to install any additional dependencies.
- Tiny size
- Zero dependencies
- Object-oriented usage
- Does not require any root access
- Works on shared servers
- Easy to use (no class inheritance, etc)
- Can stream realtime data between threads
Just copy the class.naturalthreading.php into your working path, where it is easily accessible by your PHP script.
<?php
require_once("class.naturalthreading.php");
function doStuff($arg) {
// print count & argument after every 1 second.
for($i = 0; $i < 3; $i++) {
// send(...) sends back the data to main thread which does the echo.
NaturalThreading::send("Count: " . $i . "; Arg: " . $arg . "<br/>");
sleep(1);
}
}
$nt = new NaturalThreading();
// add the function, (optional arguments)
$nt->add("doStuff", "I am thread 1");
$nt->add("doStuff", "I am thread 2");
// execute the given
$ret = $nt->execute();
echo "Done!";
?>
You'll find plenty more to play with in the examples folder.
Browsers do not directly allow realtime data output, so some browser hacks had to be used here. I used SESSION for realtime thread communication and whitespace stuffing (adding spaces between messages) for realtime output. If you want to get realtime messages without whitespace stuffing, use an output handler.
This project was initially started when I was writing a piece of code that scrapped thousands of URLs, and it was terribly slow. So I decided to use pthread library, but my client's shared host could not allow it. So I decided to write this tiny hack that worked on shared hosts as well, and it instantly increased the download performance by 10x! Check out the parallel downloading example that illustrates this.
<?php
require_once("class.naturalthreading.php");
function downloadFile($url) {
NaturalThreading::send("Started downloading: " . $url . "<br/>");
// download and save the file as download.zip
file_put_contents('downloaded.zip', file_get_contents($url));
NaturalThreading::send("Download completed: " . $url . "<br/>");
}
$nt = new NaturalThreading();
// these URLs are of dummy files for speed test
$nt->add("downloadFile", "http://speedtest.wdc01.softlayer.com/downloads/test1.zip");
$nt->add("downloadFile", "http://speedtest.wdc01.softlayer.com/downloads/test1.zip");
$nt->add("downloadFile", "http://speedtest.wdc01.softlayer.com/downloads/test1.zip");
$nt->add("downloadFile", "http://speedtest.wdc01.softlayer.com/downloads/test1.zip");
echo "Downloading 4 files in parallel" . "<br/>";
$ret = $nt->execute();
echo "Done!";
?>
- Since this library depends on SESSION for communication, it might mess up with your login system. Any contribution on this issue will be appreciated.
Please submit bug reports, suggestions and pull requests to the GitHub issue tracker. I would be happy if someone helps in expanding its functionality by adding more useful threading features such as joining threads and thread-pooling.
This software is licenced under the LGPL 2.1. Please read LICENSE for information on the software availability and distribution.