2012-09-21 64 views
6

的進步,我需要的HTML頁面和PHP腳本的JS之間提供互動。
- 使用AJAX。
好的。但問題是,PHP腳本很長一段時間執行,而我需要知道這個腳本處理(例如60%完成)狀態
我應該怎麼辦?創建2個PHP腳本(客戶端&服務器),並執行到client.php的ajax請求,這將通過套接字或smth請求到server.php? 有沒有更優雅的解決方案?的Javascript得到PHP腳本

+0

那麼,使用文件可以幫助,但它仍然不是我的夢想。 如果我需要經常從php-script獲取信息,該怎麼辦?對於文件系統來說這不會太昂貴嗎? – Dmitriy

+0

讀取文件對於計算機來說是非常容易的。 – thatidiotguy

回答

2

如果腳本正在執行處理,則會在一段時間內將其狀態寫入文件。製作第二個腳本來讀取文件並返回原始文件的狀態。

2
  1. Ajax調用php腳本並返回腳本正在運行的信息。
  2. 主腳本創建lock.file。如果lock.file存在和運行正確的腳本
  3. 腳本從cron調用時檢查。
  4. 正確的腳本保存當前進度爲progress.txt。
  5. 阿賈克斯閱讀progress.txt當進度爲100%,則返回該腳本處理完成的信息。

編輯:多虧了賈斯汀的poiting超時問題;如果你想成爲真正看中的,寫在PHP腳本到stdout輸出,並通過管道捕捉它)

+0

即使您在主腳本中使用fork()來在後臺執行處理,如果請求長時間運行,您的HTTP服務器仍然可以中止請求。有辦法解決這個問題,但更好的解決方案是將耗時的流程完全移出Web服務器的責任範圍。 –

+0

當然,但是主腳本代替處理操作只能創建一個鎖文件,然後當鎖文件存在時從cron運行的另一個腳本可以運行主進程。從cli通常調用的腳本沒有任何超時:) –

+0

你應該更新答案來包含它。目前的措辭(*「主要腳本寫入progress.txt文件的進度」*)並沒有說明cron正在執行「主腳本」並尋找一個開始處理的信號。 –

1

。這需要使用exec()或proc_open()(http://php.net/manual/en/function.proc-open.php)來運行php腳本,並將輸出傳遞給一個文件(或者如果你想成爲額外多餘的花哨,用Node.js的偵聽數據)

有相當多的方式來實現這一點:

  • Node.js的
  • 一個Ajax查詢每x秒
  • 元/ JavaScript頁面重新加載
  • 是經常與它的地位重新加載一個IFRAME。

祝你好運!

2

您不應該在HTTP會話中完全執行長時間運行的進程。

這個問題的一個簡單和常見的方法是消息排隊。基本上,您的UI將請求排隊到數據庫表中,然後讓外部守護進程處理隊列。

要提供反饋,讓守護進程定期用它當前正在處理的行的狀態更新表。然後,您的JavaScript代碼可以向腳本發出AJAX請求,該腳本從數據庫中檢索該工作項的狀態並將其顯示給用戶。

參見:Dealing with long server-side operations using ajax?

0

你可以使用PHP的輸出緩衝(見ob_flush)衝在某些點的內容在你的劇本和定製你的JavaScript,以便它使用的刷新內容。我相信您的AJAX調用中的readyState在刷新時不會設置爲4,因此您必須自己處理它(請參閱this article)。我認爲它比寫入文件和檢查文件內容要好得多。

0
process.php

// 1st task 
$_SESSION['progress'] = 0; 

// your code for the first task here ... 

// 2nd task 
$_SESSION['progress'] = 10; 

// you code for 2nd task ... 

// 3rd task 
$_SESSION['progress'] = 17; 

// continue ... 

// everything finished? 
$_SESSION['progress'] = 100; 

progress.php

// simply output 
echo $_SESSION['progress']; 
現在從您的客戶端

,只是做一個請求,你progress.php,收到的號碼,並把它交給你的進步酒吧...

沒有檢查我自己,但希望它的作品! :)