【问题标题】:Improve Page Performance, save PHP array on server?提高页面性能,在服务器上保存 PHP 数组?
【发布时间】:2015-09-17 10:55:48
【问题描述】:

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

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

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

定时任务:

<?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');
?>

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

1st:解析数据到数组

$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

4th:初始化数据表插件

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

有什么可以更快完成的吗?

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

-内狼

【问题讨论】:

  • 您可以尝试将解析后的数组存储在会话或 Memcached 中。也许存储了一个带有硬编码数组的 PHP 文件。打开 CSV 文件,对其进行解析,然后将其保存为 PHP 文件。然后加载 PHP 文件。
  • 您没有将其存储在数据库中是否有原因?
  • 我认为数据库是不必要的,因为它也适用于 php。我也不知道如何将文件从 url 直接存储到 sql
  • 您可以简单地编写一个 PHP 文件,其中包含生成的数组,并包含该文件。或者您可以将 json 写入 javaScript 文件并将其包含到您的输出中。
  • 为什么它需要以 CSV 文件而不是数据库开头?

标签: javascript php jquery arrays performance


【解决方案1】:

解析 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() 来替换“实时”脚本—— move() 或多或少是原子的,并且不会导致任何人得到一个半文件。

另外,请注意,您需要对脚本所在位置的写入权限——有一些方法可以保证这一点相当安全(不要让您的 PHP 脚本在整个硬盘驱动器上写入),但这超出了这里的范围。

【讨论】:

    【解决方案2】:

    既然您提到按小时获取数据,我建议如下:

    1. 使用 cron 抓取 CSV 文件并按小时将数据存储在数据库中
    2. 配置您的数据表组件以使用server side data

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

    【讨论】:

      猜你喜欢
      • 2011-09-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-06
      • 2014-10-08
      • 1970-01-01
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多