我创建了一个PHP文件,设置为读取本地文本文件的内容,解析为数组,然后在主页面中填充表格。但是,即使只有53行此文本文件在显示任何内容之前加载页面大约需要10秒钟。
我知道这是一个限制,服务器需要在将其发送到客户端之前创建整个html文件,并且这一代需要时间取决于要生成的内容的大小,这意味着这10秒可能会增加要处理更多行。最终产品将有超过500行处理,因此生成需要几分钟,然后发送给客户。
我想知道我是否可以绕过这个,向客户端发送一个包含空表的小html文件,然后开始使用PHP填充并填充此表,但我不确定如何解决这个问题。我会将include调用一个单独的php文件来调用生成代码,还是让服务器一次“流”出一行表的内容?
相关网页是:http://zionfox.net/cards.php。当前加载时间大约需要7-10秒,我想通过加载核心表来减少这一点,然后显示源表生成的表行。
编辑:有更大图像的原因:当放大移动设备时,我宁愿图像像字体一样清晰锐利。我尝试使用实际大小的图像(20px),放大后它们变得几乎不可读。我意识到.png可能不是最好的格式,但这是我第一次使用file_put_contents()
并且我并非完全确保源文件的图像,也不确保图像保持透明度。
编辑:编辑:文件的来源是:http://zionfox.net/cards.php.txt - 请原谅代码的粗糙,它仍在进行中,我想在整理代码之前先让它工作。
使用explode()
将文件拆分为由字符分隔的数组。然后使用更多explode()
s将这些数组中的每一个拆分为更多数组,然后处理此数组的每个部分以查看条件是否匹配,并根据值返回正确的结果,包括从外部源提取图像如果我还没有图像。然后在for循环的底部将echo
编辑为$handle = fopen($pathToFile, "r");
if(ob_get_level() == 0) ob_start();
if($handle) {
while(($line = fgets($handle)) !== false) {
echo $row . "<br />";
//The code you want to process
ob_flush();
flush();
}
}
ob_end_flush();
fclose($handle);
以创建新的表行,然后重复下一行的过程。
感谢Tenhsor,解决方案:
%windir%\system32\inetsrv\appcmd.exe set config /section:handlers "/[name='PHP53_via_FastCGI':ResponseBufferLimit:0"
在他们的回复中找到了完整的解决方案。
我还想补充一点,这个代码本身并没有解决我的问题。我正在运行IIS 7.5并且必须发出命令才能使其正常工作。该命令取决于您的PHP版本,您应该可以通过IIS找到它。给cmd.exe的命令是:
PHP53_via_FastCGI
其中{{1}}是PHP的名称和版本。
答案 0 :(得分:1)
如果文件的解析很简单(意味着不涉及复杂的逻辑),则处理时间不应超过10秒。检查您是否可以以某种方式优化代码或在此处显示。
如果您的内容不经常更改,您可以考虑的一件事就是缓存。这意味着您只计算一次表并重用这些计算值并将它们发回给浏览器。
有关详细信息,请参阅:http://www.slideshare.net/anisniit/caching-new。
答案 1 :(得分:1)
您可以使用flush php函数向客户端发送大量信息。 例如,如果您使用循环显示html表,则可以执行以下操作:
file = @fopen('path/to/my/file', 'rb');
$buffer = 1024 * 8;
echo '<table>';
while (!feof($file)) {
echo '<tr><td>'.fread($file, $buffer).'</td></tr>';
ob_flush();
flush();
}
echo '</table>';
ob_end_flush();