2009-08-13 68 views
1

我的脚本由两部分组成。 第一部分生成HTML页面。 第二部分从网络加载资源并将其保存到文件中。 加载操作很长,最多可能需要10秒。 第一部分和第二部分完全独立(加载对页面外观没有影响)。PHP:如何在脚本结束之前显示页面?

在第一部分结束时,我调用flush(),它使页面立即显示。

但是,嵌入SWF电影此时不显示。

SWF是页面的关键元素,它必须尽可能快地显示。 它被嵌入到SwfObject库的页面中。 问题是SwfObject开始在页面的“onLoad”事件中打开SWF。

但是“onLoad”事件发生在第二个部分的末尾。 即“onLoad”可以在10秒内发生。 因此,尽管flush()调用用户必须等待10秒徒然。

是否有可能解决PHP端的任务? 是否可以在单独的进程中运行“加载”任务(第二部分)? 是否有可能在第二部分开始之前告诉浏览器,该页面是否为reay,并且您可以广播“onLoad”事件。

感谢您阅读这个很长的故事。

回答

2

我建议拆分代码成两个独立的PHP文件:

的第一个文件生成包含SWF的HTML页面。

第二个文件获取资源并进行保存。

诀窍是,在第一页的onLoad事件中,运行一小段JavaScript请求第二页的URL。

在第一页中的代码会是这个样子:

... 
<body onload="makeRequest('page2.php')"> 
... 

其中makeRequest的是一个功能有点像一个在这里:http://www.captain.at/howto-ajax-form-post-get.php

AJAX Tutorial化妆是理解是有帮助的。

当然,如果这些东西是真正独立的,你应该看看在另一个进程或线程中运行第二个东西。 pcntl-fork可能对此有所帮助。

+0

如果JS被禁用,该怎么办;)? – Wookai 2009-08-14 08:46:45

+0

然后,我绝对建议使用pcntl-fork或系统在单独的进程中运行第二部分。 – 2009-08-15 08:47:47

2

PHP不支持线程,所以你必须编写一个脚本来完成第二部分,并使用exec()方法运行它。但这可能不是最好的解决方案。

如果您使用的是MVC控制器,您可能会做的是忘记移动需要很长时间来分离脚本或控制器操作的第二部分。然后,只需运行第一部分,页面就会快速加载。然后,您可以添加一个AJAX来调用该新脚本/操作,以便在加载页面后运行算法的第二部分。

+1

+1对于MVC:只需在加载swf后触发与ajax的动作调用 – markus 2009-08-13 12:51:59

+0

谢谢,我会尝试这种方法。 – Pavel 2009-08-13 12:58:14

1

您可以在页面末尾添加一个脚本块来初始化您的SWF电影,而不是“onload”?

+0

SWFObject不提供API方法使其合法。 我宁愿避免黑客入侵这个库。 – Pavel 2009-08-13 12:54:57

1

我不确定,但如果你把这个SWF电影放在IFRAME里怎么办?

+0

不幸的是,这不是我的情况 – Pavel 2009-08-13 12:56:29

0

一种方法是通过第一阶段的单向web服务请求启动第二阶段。假设您使用的是PHP 5,请查看SOAP支持。

如果客户端在调用flush()后没有加载,那么有两种可能性:第一,Web服务器可能会缓冲输出,并且不会传递给客户端;其次,您在调用flush()时没有生成完整的页面。后一个问题应该很容易解决。

+0

该页面在flush()后完全显示,但“onload”事件没有被触发。感谢SOAP的想法。 – Pavel 2009-08-13 12:57:42

+0

浏览器会在收到内容时立即开始显示内容,但在接收到收尾HTML标记之前不会调用onLoad事件。使用Firebug或Fiddler等监控工具来验证您是否实际发送完整页面。 – kdgregory 2009-08-13 13:22:18

相关问题