2009-08-13 98 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

相關問題