0

我创建了一个 PHP 文件,该文件设置为读取本地文本文件的内容,解析为一个数组,然后在主页中填充一个表。然而,即使这个文本文件只有 53 行,也需要大约 10 秒来加载页面,然后才会显示任何内容。

我知道这是一个限制,服务器需要在将其发送给客户端之前创建整个 html 文件,并且这一代需要时间取决于要生成的内容的大小,这意味着这 10 秒可能会随着更多行而增加过程。最终产品将有超过 500 行要处理,因此这将需要几分钟来生成,然后发送给客户端。

我想知道我是否可以绕过这个,向客户端发送一个包含一个空表的小 html 文件,然后开始使用 PHP 填充和填充这个表,但我不确定如何去做。我是否会将一个包含调用到一个单独的 php 文件中,该文件将调用生成代码,或者让服务器一次“流式传输”一个表格行的内容?

有问题的页面是:http: //zionfox.net/cards.php。当前的加载时间大约需要 7-10 秒,我想通过仅加载核心表来减少这一时间,然后显示源生成的表行。

编辑:更大的图像也是有原因的:在移动设备上放大时,我希望图像像旁边的字体一样清晰锐利。我尝试使用实际大小的图像(20px),放大后它们变得几乎不可读。我意识到 .png 可能不是最好的格式,但这是我第一次使用file_put_contents(),我不完全确定源文件的图像,也不能确保图像保持透明度。

编辑:编辑:文件的来源是:http: //zionfox.net/cards.php.txt - 请原谅代码的邋遢,它仍在大量工作中,我想在整理之前先让它工作代码。

该文件被分割成一个数组,由字符分隔,使用explode(). 然后使用更多 s 将这些数组中的每一个拆分为进一步的数组explode(),然后处理该数组的每个部分以查看条件是否匹配,并根据值返回正确的结果,包括如果我不从外部来源提取图像已经有了图像。这一切都echo在 for 循环的底部被删除以创建一个新的表行,然后它为下一行重复该过程。


感谢 Tenhsor,解决了这个问题:

$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);

在他们的回复中找到了完整的解决方案。

我还想补充一下,仅此代码并不能解决我的问题。我正在运行 IIS 7.5,必须发出命令才能使其正常工作。该命令取决于您的 PHP 版本,您应该可以通过 IIS 找到该版本。给 cmd.exe 的命令是:

%windir%\system32\inetsrv\appcmd.exe set config /section:handlers "/[name='PHP53_via_FastCGI':ResponseBufferLimit:0"

PHP53_via_FastCGIPHP 的名称和版本在哪里。

4

2 回答 2

1

如果文件的解析很简单(意味着不涉及复杂的逻辑),则处理时间不应超过 10 秒。检查您是否可以以某种方式优化您的代码或在此处显示它。

如果您的内容不经常更改,您可以考虑的一件事称为缓存。这意味着您只计算一次表并重用这些计算值并将它们发送回浏览器。

有关详细信息,请参阅:http ://www.slideshare.net/anisniit/caching-new 。

于 2014-10-05T16:19:11.117 回答
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();
于 2014-10-05T16:24:02.390 回答