I would like to get idea on how to process a while loop which consist of more than 3000 rows
while ($row = mysql_fetch_array($result)) {
if $row["Status"] == 1 {
//Curl 3PP and Update DB
} else {
//Curl 3PP and Update DB
}
}
Since the row of the result is huge and the while loop is taking around 1 hour to complete process it. Is there any suggestion to expedite the process?
I was thinking of having another PHP to spawn workers to process the CURL and UpdateDB part. Something like this :
while ($row = mysql_fetch_array($result)) {
if ($row["Status"] == 1) {
exec("php curl_update.php?database=success");
} else {
exec("php curl_update.php?database=fail");
}
}
Is it a good idea or is there any other ways to fulfill the following requirement using PHP or any other library?
In the curl command, i’ll be sending transactionID to a 3rd party API to get the status whether it’s fail or success. Latency is around 1-5 seconds
Advertisement
Answer
I think you have a few options now including @DarkBee’s exec('php ...' > /dev/null 2>/dev/null &');
and also curl_multi_init
.
Here’s a quick example showing the time difference between initiating 100 requests using curl_multi_init
Vs. the traditional curl_exec
.
<?php
$time_start = microtime(true);
$nodes = array_fill(0, 100, 'https://www.google.ca');
// Total time: 1.8 seconds
multiHandle($nodes);
// Vs.
// Total time: 13.5 seconds
//traditional($nodes);
$time_end = microtime(true);
$execution_time = ($time_end - $time_start);
echo sprintf('<b>Total Execution Time:</b> %s secs', round($execution_time, 2));
/*****************************************************************/
/**
* Taken from: https://stackoverflow.com/a/9311112/296555
*/
function multiHandle($nodes)
{
$node_count = count($nodes);
$curl_arr = array();
$master = curl_multi_init();
for ($i = 0; $i < $node_count; $i++) {
$url = $nodes[$i];
$curl_arr[$i] = curl_init($url);
curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($master, $curl_arr[$i]);
}
do {
curl_multi_exec($master, $running);
} while ($running > 0);
for ($i = 0; $i < $node_count; $i++) {
curl_multi_getcontent($curl_arr[$i]);
}
}
/**
* Taken from: https://www.php.net/manual/en/curl.examples.php#88055
*/
function traditional($nodes)
{
foreach ($nodes as $destination) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $destination);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_exec($ch);
curl_close($ch);
}
}