我的脚本由两部分组成。 第一部分生成HTML页面。 第二部分从网络加载资源并将其保存到文件中。 加载是一项长时间的操作,最多可能需要10秒钟。 第一部分和第二部分完全独立(加载对页面外观没有影响)。
在第一部分结束时,我调用flush(),使页面立即显示。
但是,此刻不会显示嵌入式SWF电影。
SWF是页面的关键元素,必须尽快显示。 它嵌入在带有SwfObject库的页面中。 问题是SwfObject开始在页面的“onLoad”事件上打开SWF。
但是“onLoad”事件出现在 second 部分的末尾。 那就是“onLoad”可以在10秒内发生。 因此,在spite flush()调用中,用户必须等待10秒才能徒劳。
是否有可能在PHP方面解决任务? 是否可以在单独的进程中运行“加载”任务(第二部分)? 是否可以在第二部分开始之前告诉浏览器,页面是reay并且您可以广播“onLoad”事件。
感谢您阅读这篇长篇故事。
答案 0 :(得分:2)
PHP不支持线程,因此您必须编写一个脚本来执行第二部分并使用exec()
方法运行它。但这可能也不是最好的解决方案。
如果您使用的是MVC控制器,那么您可能会忘记移动需要很长时间来分离脚本或控制器操作的第二部分。然后只需运行第一部分,您的页面就会快速加载。然后,您可以添加一个AJAX来调用该新脚本/操作,以在页面加载后运行算法的第二部分。
答案 1 :(得分: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可能会有所帮助。
答案 2 :(得分:1)
您可以在页面末尾添加脚本块来初始化SWF电影,而不是“onload”吗?
答案 3 :(得分:1)
我不确定,但是如果你把这个SWF电影放在IFRAME中会怎么样?
答案 4 :(得分:0)
一种方法是通过第一阶段的单向Web服务请求启动第二阶段。假设您使用的是PHP 5,请查看SOAP支持。
如果客户端在调用flush()后没有加载,那么有两种可能性:首先,Web服务器可能正在缓冲输出而它没有到达客户端;第二,你在调用flush()时没有生成一个完整的页面。后一个问题应该很容易解决。