So what you want to do is asynchronous execution of the cUrl Requests.
So you would need a asynchronous/parallel processing library for php.
Async cURL
The other way is to use the built in asynchronous cURL functions.
So, when using curl_multi_*
, your code would look something like:
$username = 'xxxxx';
$api_onfleet = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$url_onfleet = "//onfleet.com/api/v2/tasks";
curl_setopt[$curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2];
$request = $url.'api/mail.send.json';
// Generate curl request
$session = curl_init[$request];
// Tell curl to use HTTP POST
curl_setopt [$session, CURLOPT_POST, true];
// Tell curl that this is the body of the POST
curl_setopt [$session, CURLOPT_POSTFIELDS, $params];
// Tell curl not to return headers, but do return the response
curl_setopt[$session, CURLOPT_HEADER, false];
curl_setopt[$session, CURLOPT_RETURNTRANSFER, true];
// Post the Pickup task to Onfleet
$ch = curl_init[];
curl_setopt[$ch, CURLOPT_URL, $url_onfleet];
curl_setopt[$ch, CURLOPT_FOLLOWLOCATION, 1];
curl_setopt[$ch, CURLOPT_RETURNTRANSFER, 1];
curl_setopt[$ch, CURLOPT_SSL_VERIFYPEER, false];
curl_setopt[$ch, CURLOPT_USERPWD, $api_onfleet];
curl_setopt[$ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC];
curl_setopt[$ch, CURLOPT_ENCODING, ""];
curl_setopt[$ch, CURLOPT_POST, true];
curl_setopt[$ch, CURLOPT_POSTFIELDS, '{"destination":{"address":{"unparsed":"'.$pickup_address.'"},"notes":"'.$comments.'"},"recipients":[{"name":"'.$name.'","phone":"+61'.$phone.'","notes":"Number of riders: '.$riders.'"}],"completeBefore":'.$timestamp.',"pickupTask":"yes","autoAssign":{"mode":"distance"}}'];
$mh = curl_multi_init[];
curl_multi_add_handle[$mh,$session];
curl_multi_add_handle[$mh,$ch];
$active = null;
//execute the handles
do {
$mrc = curl_multi_exec[$mh, $active];
} while [$mrc == CURLM_CALL_MULTI_PERFORM];
while [$active && $mrc == CURLM_OK] {
if [curl_multi_select[$mh] != -1] {
do {
$mrc = curl_multi_exec[$mh, $active];
} while [$mrc == CURLM_CALL_MULTI_PERFORM];
}
}
//close the handles
curl_multi_remove_handle[$mh, $ch2];
curl_multi_remove_handle[$mh, $ch2];
curl_multi_close[$mh];
Suggested Reading:
curl_multi_init[]
curl_multi_exec[]
curl_multi_add_handle[]
curl_multi_remove_handle[]
pThreads
One of the prominent threading
libraries for php is pthreads
You would need to first get the dll/so file and save it in the php/ext
dir, and enable that extension in php.ini
.
After That, this code would do your job:
class Request1 extends Thread {
$username = 'xxxxx';
$api_onfleet = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$url_onfleet = "//onfleet.com/api/v2/tasks";
public function run[] {
curl_setopt[$curl, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_2];
$request = $this->url.'api/mail.send.json';
// Generate curl request
$session = curl_init[$request];
// Tell curl to use HTTP POST
curl_setopt [$session, CURLOPT_POST, true];
// Tell curl that this is the body of the POST
curl_setopt [$session, CURLOPT_POSTFIELDS, $params];
// Tell curl not to return headers, but do return the response
curl_setopt[$session, CURLOPT_HEADER, false];
curl_setopt[$session, CURLOPT_RETURNTRANSFER, true];
// obtain response
$response = curl_exec[$session];
curl_close[$session];
}
}
class Request2 extends Thread {
$username = 'xxxxx';
$api_onfleet = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
$url_onfleet = "//onfleet.com/api/v2/tasks";
public function run[] {
$ch = curl_init[];
curl_setopt[$ch, CURLOPT_URL, $url_onfleet];
curl_setopt[$ch, CURLOPT_FOLLOWLOCATION, 1];
curl_setopt[$ch, CURLOPT_RETURNTRANSFER, 1];
curl_setopt[$ch, CURLOPT_SSL_VERIFYPEER, false];
curl_setopt[$ch, CURLOPT_USERPWD, $this->api_onfleet];
curl_setopt[$ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC];
curl_setopt[$ch, CURLOPT_ENCODING, ""];
curl_setopt[$ch, CURLOPT_POST, true];
curl_setopt[$ch, CURLOPT_POSTFIELDS, '{"destination":{"address":{"unparsed":"'.$pickup_address.'"},"notes":"'.$comments.'"},"recipients":[{"name":"'.$name.'","phone":"+61'.$phone.'","notes":"Number of riders: '.$riders.'"}],"completeBefore":'.$timestamp.',"pickupTask":"yes","autoAssign":{"mode":"distance"}}'];
$result_pickup = curl_exec[$ch];
curl_close[$ch];
// Post the Dropoff task to Onfleet
$curl = curl_init[];
curl_setopt[$curl, CURLOPT_URL, $this->url_onfleet];
curl_setopt[$curl, CURLOPT_FOLLOWLOCATION, 1];
curl_setopt[$curl, CURLOPT_RETURNTRANSFER, 1];
curl_setopt[$curl, CURLOPT_SSL_VERIFYPEER, false];
curl_setopt[$curl, CURLOPT_USERPWD, $this->api_onfleet];
curl_setopt[$curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC];
curl_setopt[$curl, CURLOPT_ENCODING, ""];
curl_setopt[$curl, CURLOPT_POST, true];
curl_setopt[$curl, CURLOPT_POSTFIELDS, '{"destination":{"address":{"unparsed":"'.$dropoff_address.'"},"notes":"'.$comments.'"},"recipients":[{"name":"'.$name.'","phone":"+61'.$phone.'","notes":"Number of riders: '.$riders.'"}],"autoAssign":{"mode":"distance"}}'];
$result_dropoff = curl_exec[$curl];
curl_close[$curl];
}
}
$req1 = new Request1[];
$req1->start[];
$req2 = new Request2[];
$req2->start[];
So, basically you need to create a class which extends the Thread
class and everything you want to run asynchronously [rather parallely], would be put in the function run[]
of the class.
When you want to start the thread just instantiate the class in a variable, and call the
start method of the object, like $threadsObject->start[]
and everything in the run[]
would be executed on another thread.
Reference:
class::Thread
Thread::start
That's it.