Some people have mentioned to me that my site is quite inefficient and given that it's taking ~17secs to load now, I'd like to change that but I've no idea how. I've tried Gzip to compress it but it didn't help. I got rid of some "" and have used '' instead as well as got rid of some html blank spaces but that's about it. Below is most of my code, excluding some JS to save space. Either way, when I do F12 on my site, Google shows that it's the php file itself that takes so long to load, not JS so that's why I'm just showing that below. It's just this one page that's loading slowly, all others sites are very quick. I'd love some tips on how to make this more efficient. Thank you! <?php require('includes/connection.php'); require('includes/config.php'); // Page name $title = 'Portfolio'; // Include the header template require('layout/header.php'); // If for some reason, not logged in then redirect to login page if(!$user->is_logged_in()){ header('Location: login.php'); exit(); } ?> <div> <h2><?php echo htmlspecialchars($_SESSION['username'], ENT_QUOTES); ?></h2> <button id="opener" class='btn btn-success' >Advanced Company Data</button> <div id="dialog" title="Advanced Company Data"><a href="http://www.nasdaq.com/symbol/aapl">Exchange Information</a> </div> </div> <script> $("#dialog").dialog({ autoOpen: false }); $("#opener").click(function() { $("#dialog").dialog("open", "modal", true ); }); </script> </div> <?php $spy = file_get_contents('https://api.iextrading.com/1.0/stock/spy/stats/year1ChangePercent'); $spy = json_decode($spy,TRUE); // Initialising variables to store extracted information $name = []; $symbol = []; $open = []; $close = []; $high = []; $low = []; $lastprice = []; $y = 0; $z = ''; $key = '93dcc722279c3a7577f248b09ef6167f'; // Retreiving information from database $memberid = $_SESSION['memberID']; $sql = "SELECT * FROM portfolio WHERE memberID = $memberid"; $result = mysqli_query($conn, $sql); // Check if databse is empty if (mysqli_num_rows($result) > 0) { while($row = mysqli_fetch_assoc($result)) { $sym[$y] = $row['stocks_symbol']; $pri[$y] = $row['price']; $vol[$y] = $row['quantity']; $id[$y] = $row['memberid']; $y += 1; } } // If database empty else { echo 'Portfolio Empty'; die(); } mysqli_close($conn); // Adding all stock names in one variable to enable API call for($a=0;$a<$y;$a++) { $z = $z.$sym[$a].','; } $z = rtrim($z,','); // API call $contents = file_get_contents("http://marketdata.websol.barchart.com/getQuote.json?key=$key&symbols=$z&mode=R"); $contents = json_decode($contents, true); // Check successfull API call if($contents['status']['code'] == 200) { foreach($contents['results'] as $result) { array_push($name,$result['name']); array_push($symbol,$result['symbol']); array_push($open,$result['open']); array_push($close,$result['close']); array_push($high,$result['high']); array_push($low,$result['low']); array_push($lastprice,$result['lastPrice']); } } // If API call unsuccessful else { echo 'Error retreiving data. Please try again later.'; die(); } ?> <!-- Generating Output in tabular format --> <table id= test class='table table-responsive'> <tr class='head warning'> <th>Name</th> <th>Symbol</th> <th>Open</th> <th>Close</th> <th>High</th> <th>Low</th> <th>Last Price</th> <th>Price Bought</th> <th>Quantity</th> <th>Change Per Stock</th> <th>Profit/Loss</th> <th>Amount Invested</th> <th>Current Market Value</th> <th>Dividend</th> <th>Total Dividend</th> <th>Company Description</th> <th>Latest News</th> </tr> <?php $profitOrLossSum = 0; $dividendRateSum = 0; $startEqSum = 0; $sumOf = array(); $pnl = array(); for($x=0;$x<$y;$x++) {?> <tr> <td class="input"><?php echo $name[$x]; ?></td> <td class="input"><?php echo $symbol[$x]; ?></td> <td class="input"><?php echo $open[$x]; ?></td> <td class="input"><?php echo $close[$x]; ?></td> <td class="input"><?php echo $high[$x]; ?></td> <td class="input"><?php echo $low[$x]; ?></td> <td class="input"><?php echo $lastprice[$x]; ?></td> <td class="input"><?php echo $pri[$x]; ?></td> <td class="input"><?php echo $vol[$x]; ?></td> <td class="input"><?php if($pri[$x] > $lastprice[$x]) { echo $lastprice[$x]-$pri[$x]; } else if($pri[$x] < $lastprice[$x]) { echo $lastprice[$x]-$pri[$x]; } else echo '0'; ?></td> <td class="input"><b><?php $profitOrLoss = ($lastprice[$x]-$pri[$x]) * $vol[$x]; $profitOrLossSum += $profitOrLoss; $pnl[] = $profitOrLoss; echo $profitOrLoss; ?></b></td> <td><?php $starteq = $pri[$x] * $vol[$x]; $startEqSum += $starteq; echo $starteq; ?></td> <td><b><?php $firstno1 = floatval($vol[$x]); $secondno1 = floatval($lastprice[$x]); $sumOf[] = $firstno1 * $secondno1; $sum1 = $firstno1 * $secondno1; echo ($sum1); ?> </b></td> <td><?php $div = file_get_contents("https://api.iextrading.com/1.0/stock/market/batch?symbols=$symbol[$x]&types=stats&filter=dividendRate"); $div = json_decode($div,TRUE); $sum = 0; foreach($div as $divi => $value) { echo $value['stats']['dividendRate']; $sum += (floatval($vol[$x]) + floatval($value['stats']['dividendRate'])); } ?></td> <td><?php $firstno = floatval($vol[$x]); $secondno = floatval($value['stats']['dividendRate']); $sum2 = 0; $sum2 += $firstno * $secondno; echo ($sum2); $dividendRateSum += $sum2; ?></td> <td class="input"><?php $desc = file_get_contents("https://api.iextrading.com/1.0/stock/market/batch?symbols=$symbol[$x]&types=company&filter=description"); $desc = json_decode($desc,TRUE); foreach($desc as $desc => $des) { echo $des['company']['description']; } ?></td> <td><?php $desc1 = file_get_contents("https://api.iextrading.com/1.0/stock/market/batch?symbols=$symbol[$x]&types=news&filter=headline,url&range=1m&last=1"); $desc1 = json_decode($desc1,TRUE); foreach($desc1 as $key111 => $des1) { echo implode(PHP_EOL, array_column($des1['news'],'headline')); ?><br><?php $link = implode(PHP_EOL, array_column($des1['news'],'url')); echo '<a href="'.$link.'">Link</a>'; } ?></td> </tr> <?php } $arr = array('profitOrLossSum' => $profitOrLossSum, 'dividendRateSum' => $dividendRateSum); $arr1 = array('startEqSum' => $startEqSum); $array = array_combine($name, $sumOf); $array10 = array_combine($name, $pnl); ?> </table> <h3> SPY %YTD= <?php echo $spy1 = number_format($spy *100, 2); ?>%</h3> <br> <h3> Starting Equity= $<?php echo $startEqSum; ?></h3> <h3> Current Equity= $<?php echo $profitOrLossSum; ?></h3> <h3> Total Profit= $<?php echo $profitOrLossSum - $startEqSum; ?></h3> <h3> % Gain/Loss= <?php echo $gain = number_format((($profitOrLossSum - $startEqSum) / $startEqSum) * 100, 2); ?>%</h3> <h3> Total Dividend= $<?php echo $dividendRateSum / 4; ?>/Quarter</h3> <h3> Portfolio vs SPY= <?php echo $gain-$spy1; ?>%</h3><br> </body> Code (markup):
You're using multiple api calls. Depending on how much javascript/jquery they have to load, it can significantly delay your page load. At least, something you should look into. Remove all the api links, then check if it starts loading faster.
Thanks for the idea. It does look like the marketdata API is what's causing the slow down. Is there any way to make this faster or not really?
You can try to call them asynchronously (each file_get_contents). It may speed it up somewhat. Or you can show a progress bar with the message "Data is being retrieved. Please wait." until everything is loaded. Still, even if you reduce the page load to 10 seconds, it will still be too long. You need to find a long term solution.
Optimize your calling code. Trace your specific script from help of developer tools. Check calling method , is it direct calling from code or via server ,than optimize it.
If possible you could test each API call one by one. So you could see where is the most time-consuming task. You could load slowest parts with ajax after page load.