2011-07-04 48 views
1

我正在尋找VB等效的VB doevents。 我在VB中編寫了一個實時分析包,並使用doevents發佈到操作系統。 Doevents允許我留在內存中,並且不會填滿內存並且可以讓我響應用戶輸入。 我已經重寫了PHP中的包,我正在尋找同樣的doevents功能。 如果它不存在,我可以重新安排自己並退出。 但我目前不知道該怎麼做,我認爲這會增加更多的開銷。 謝謝gerardg我正在尋找VB等效的VB doevents

+0

你是否觸發代碼作爲網頁,或作爲cron工作? – BugFinder

+1

PHP不適用於實時處理。除非你在一個合作的多任務系統上(例如Win 3.x),否則在某些時候腳本的時間片將被耗盡,並且控制將被從中排除。 –

+0

回答BugFinder問題:我從網頁按鈕啓動代碼。 – gerardg

回答

2

它已經近10年,因爲我上次在VB寫的任何東西,我記得的DoEvents()函數允許應用程序屈服於深加工過程中的處理器(通常以允許其他系統事件火 - 最常見的是WM_PAINT,這樣你的UI就不會出現掛起)。

我不認爲PHP有​​這樣的功能 - 你的腳本將作爲一個單獨的進程運行並結束(無論是當它完成或當它達到默認的30秒超時)。

如果您在思考線程(如大多數Windows程序員傾向於這樣做)並且需要產生一個以上的腳本實例,或許您應該看看PHP's Process Control functions作爲開始。

+0

回答Jahufar:謝謝。你理解我的問題。你和Marc B都說PHP沒有這個功能。看起來我可能能夠使用您發送的過程控制功能重新安排我的自我。我將在我自己的服務器上測試Cyclone對set_time_limit($ time),其他函數和控制函數的建議。 (我正在ISP的機器上開發,無法控制系統。)當我的服務器到達後,我會回到這裏進行更新,我可以嘗試一下。謝謝。 – gerardg

1

我不完全確定你想要模擬的doevents的哪些方面,所以這裏幾乎所有可能對你有用的東西。

您可以在腳本的頂部使用ob_implicit_flush(true)啓用隱式輸出緩衝區刷新。這意味着,只要您的腳本調用echoprint或任何您用來顯示內容的東西,PHP就會自動將其全部發送到用戶的瀏覽器。您也可以在每次調用之後使用ob_flush()來顯示某些內容,在VB中更像Application.DoEvents(),以保證您的UI處於活動狀態,但每次輸出內容時都必須調用它。

當然,如果您的腳本已經使用了輸出緩衝區,您可以在刷新之前構建一個緩衝區副本,其中ob_get_contents()

如果您需要讓腳本比平時運行更多時間,可以使用set_time_limit($time)設置更長的時間。如果你需要更多的內存,並且您可以訪問編輯您的.htaccess文件,把下面的代碼和編輯值:

php_value memory_limit 64M 

,用於設置空間限制爲64兆字節。

要一次運行多個腳本,可以使用pcntl_exec開始另一個運行。

如果我錯過了關於DoEvents()的重要信息,請告訴我,我會盡力幫助您使其工作。

+0

回答旋風:謝謝。你當然研究過這個。我仍在ISP服務器上進行開發,直到服務器到達時才能控制所有內容。我認爲,根據您的建議,我可以減少需要重新安排流程的次數。我會練習你推薦的功能,並在稍後的自己的服務器上實現它們,以期留在記憶中,而不是重新安排自己。我認爲,根據您的建議和Jahufar的過程控制功能列表(如果必須重新計劃),我可以實現DoEvents功能。謝謝。 – gerardg

+0

@gerardg:很高興我能幫忙!讓我們知道怎麼回事! – Cyclone

3

usleep是你在找什麼..延遲程序執行的微秒 http://php.net/manual/en/function.usleep.php

+0

usleep不像doevents那樣活躍,因爲它只會延遲執行而不是讓控制回到其他進程。我打開一個頁面標籤來測試一個php輸出js代碼來改變文檔標題的內容,並用一個計數器值並且使用usleep來延遲每0.01s,但是當這個測試程序仍在更新文檔標題時,我不能點擊其他頁面標籤。 –

+0

我在找什麼 – Andrew

0

PHP是專爲需要處理異步給定數。然而,它可能被迫成爲一個有點嘮叨的背景任務。

由於PHP作爲一個單獨的線程運行,因此您不必擔心讓CPU執行其他已經處理好的操作。如果情況並非如此,那麼Web服務器一次只能提供一個頁面,所有其他請求將不得不坐在隊列中。你需要編寫一些永不過期的外觀,直到發現一些可檢測到的情況(比如你在數據庫中設置的「現在請退出」消息)。

正如其他人指出的那樣,如果在每個循環中吃掉非常多的CPU,代碼將停止運行「速度太快」,因此您需要使用set_time_limit($something);或者usleep。但是,如果您還在使用數據庫連接,則大部分腳本時間實際上是等待數據庫的腳本(迄今爲止腳本的最大開銷)。

我已經看到了PHP工作線程使用屏幕創建並將其分派到後臺任務。只要您沒有會超時或退出的會話(例如,當瀏覽器關閉時),其他方法也可以使用。啓動腳本以檢查腳本是否每x分鐘或幾小時運行一次的cron可讓您自動從強制存在和/或系統重新啓動進行恢復。

TL; DR:DR:doevents被「烘烤」到PHP中,您不必擔心它。