我有一个用PHP构建的LAMP网站。 我有一个像http://myproject.com/report-download.php
这样的页面,上面有一个按钮,上面写着Export CSV
. 当用户单击该按钮时,他们会获得一个csv文件,其中包含一些最初在MySQL数据库中的报告数据。 当我只有几条记录时,这很好用。 但是当我有 100 万条记录时,页面需要更长的时间才能抓取数据并创建 csv 文件。 在此CSV创建期间,用户需要很长时间才能从网站上的一个页面转到另一个页面。
当 Web 服务器仍在生成 CSV 时,PHP 开发人员通常如何解决页面加载缓慢的问题? 我可以通过 PHP 线程解决这个问题吗? 还是我应该对阿帕奇做些什么?
加法
I create the csv file kinda like this
while($row = $db->getData($pageNumber))
{
add_to_file('file.csv.inprogress',array_to_csv($row));
$pageNumber++;
}
header("Content-type: text/csv");
header("Content-Disposition: attachment; filename=file.csv");
header("Pragma: no-cache");
header("Expires: 0");
echo file_get_contents('file.csv.inprogress');
但是创建csv文件需要很长时间,因此在此期间,用户的页面加载时间真的很慢。
我会通过运行将文件创建推送到后台
exec('nohup php script_that_creates_csv.php');
脚本完成后添加一个数据库条目,并使用 AJAX 每隔 n 秒检查一次此条目的数据库。这样,您/您的用户很可能不会为执行和创建csv而烦恼。
被调用的脚本应包含用于创建 csv 并将实际状态插入数据库的代码
根据您使用的PHP版本,您可以使用缓存扩展,例如APC,Xcache,OPCache,Eaccelerator或Memcached。它们都有类似的基准和上涨/下跌。
这是关于起伏的快速指南。 * Xcache 易于安装且效果很好,尤其是使用光速服务器时。 * PHP 5.5 不再支持 APC,取而代之的是 OPCache * 当您有多个服务器或负载均衡器时,Memcached 很好。
您也可以使用文件缓存,但它需要大量资源,而不是最快的。
在大多数情况下,Apache不应该有太多关系,但你可以尝试NGINX,看看你有什么改进。在某些情况下,它将速度提高了 10 倍,如果不知道您的 URL 和网站用途的确切含义,很难说。