0
\$\begingroup\$

Some people have mentioned to me that my site is quite inefficient and given that it's taking ~17 seconds 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 double quotes (I.e. "") and have used single quotes (I.e. '') instead, as well as got rid of some HTML blank spaces but that's about it.

Here is most of my code, excluding some JS to save space. Either way, when I open the Google Chrome developer console on my site, it 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.

<?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>
\$\endgroup\$
1
\$\begingroup\$

Broad feedback

For each value of $x less than $y there are 3 API calls - it would be wise to cache those values (e.g. in a local database, local file, etc.) and refresh values when necessary (e.g. daily, weekly, monthly, etc.

Targeted feedback

The naming of variables could be better - e.g.

  • $symbols instead of $sym
  • $prices instead of $pri
  • $volumes instead of $vol

...etc.


Instead of :

 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;
    }

Just push into the arrays without needing to increment $y:

while($row = mysqli_fetch_assoc($result)) 
    {
        $symbols[] = $row['stocks_symbol'];
        $prices[] = $row['price'];
        $volumes[] = $row['quantity'];
        $ids[] = $row['memberid'];
    }

Instead of this block:

for($a=0;$a<$y;$a++)
{
    $z = $z.$sym[$a].',';
}
$z = rtrim($z,',');

Use implode():

$z = implode(',', $sym);
\$\endgroup\$
0
\$\begingroup\$

You should copy your page and write the time taken for all file_get_contents() calls and for the query. So you will know why that is very slow.

How many people are using it? How many people are using your server? If too many then it is saturated and very very slow : change your server or the internet connection or optimise your code.

Next, use echo to write text because it s faster than stopping the script and coming back.

It is better to redo a SQL query instead of downloading a file. You could also cache the most used queries eventually in a new database table.

If using the <script> tag you should always inform what is the language.

If you use only a session variable once, it is faster not to save it first in a variable.

If you just need to display a value only don t save it in an array first but at the moment of running the query.

Prefer to use variable instead of array because it is faster.

\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.