提高页面性能,在服务器上保存PHP数组


Improve Page Performance, save PHP array on server?

是否可以将PHP数组存储到我的服务器上,现在它总是在有人从CSV文件重新加载页面时创建的,但这是不必要的,因为文件只有在每小时后才有机会创建。

ATM,页面加载大约需要9秒,这是相当长的。CSV文件有10k多行,每行9个元素,因此如果服务器不必为每个用户处理100k个元素,这将非常有利于性能。

我已经有了一个用于下载csv文件的cronjob,所以如果在下载完成后执行parse命令,每小时只执行一次,那就太好了。

cronjob:

<?php
function download_remote_file($file_url, $save_to) {
  $content = file_get_contents($file_url);
  file_put_contents($save_to, $content);
}
download_remote_file(<url here>, realpath(".") . '/dump.csv');
?>

每次重新加载页面时都会发生这种情况:

第一:将数据解析到阵列

$url = 'dump.csv';
$csvData = file_get_contents($url);
$lines = explode(PHP_EOL, $csvData);
$array = array();
foreach ($lines as $line) {
$line = str_replace("''", "&#92;", $line);
$line = str_replace("#", "&#35;", $line);
$array[] = str_getcsv($line);

第二:将数组传递给Javascript

var array = <?php echo json_encode( $array ) ?>;    

第三:创建HTML表

//some code

第四:初始化数据表插件

$(document).ready( function () {
    createtable();
    $('#scoreboard').DataTable( {
        "iDisplayLength": 50,
        language: {
            decimal: ".",       
        },
        "lengthMenu": false,
        "bLengthChange": false
    } );
} );

有什么可以做得更快吗?

如前所述,在服务器端保存php数组,或者以某种方式将JS数组与HTML表一起保存?

-Innerwolf

解析CSV后,执行以下操作:

$file = fopen('/tmp/output.js', 'w');
fwrite($file, '<script type="text/javascript">');
fwrite($file, 'var array =');
fwrite($file, json_encode( $array ));
fwrite($file, ';');
fwrite($file, '</script>');
fclose($file);
copy('/path/to/script.js', '/path/to/script.js.bak');
move('/tmp/output.js', '/path/to/script.js');

然后,稍后当您输出HTML时,您只需要坚持使用:

<script type="text/javascript" src="/scripts/script.js">

在标题中。人们的浏览器也应该适当地缓存它。注意复制和移动——你不需要严格地制作备份副本,但你必须使用move()来替换"live"脚本——move(()或多或少是原子的,不会导致任何人得到半个文件。

此外,请注意,您需要对脚本所在的位置拥有写入权限——有一些方法可以确保这一点的安全(不要让PHP脚本在硬盘上到处写),但这超出了范围。

由于您提到每小时获取数据,我建议如下:

  1. 使用cron获取CSV文件,并每小时将数据存储在数据库中
  2. 将数据表组件配置为使用服务器端数据

这样就不会强迫每个用户在每次加载第一页时同时下载整个数组。服务器端脚本只获取需要显示在表中特定页面上的记录数。