的進步,我需要的HTML頁面和PHP腳本的JS之間提供互動。
- 使用AJAX。
好的。但問題是,PHP腳本很長一段時間執行,而我需要知道這個腳本處理(例如60%完成)狀態
我應該怎麼辦?創建2個PHP腳本(客戶端&服務器),並執行到client.php的ajax請求,這將通過套接字或smth請求到server.php? 有沒有更優雅的解決方案?的Javascript得到PHP腳本
回答
如果腳本正在執行處理,則會在一段時間內將其狀態寫入文件。製作第二個腳本來讀取文件並返回原始文件的狀態。
- Ajax調用php腳本並返回腳本正在運行的信息。
- 主腳本創建lock.file。如果lock.file存在和運行正確的腳本
- 腳本從cron調用時檢查。
- 正確的腳本保存當前進度爲progress.txt。
- 阿賈克斯閱讀progress.txt當進度爲100%,則返回該腳本處理完成的信息。
編輯:多虧了賈斯汀的poiting超時問題;如果你想成爲真正看中的,寫在PHP腳本到stdout輸出,並通過管道捕捉它)
即使您在主腳本中使用fork()來在後臺執行處理,如果請求長時間運行,您的HTTP服務器仍然可以中止請求。有辦法解決這個問題,但更好的解決方案是將耗時的流程完全移出Web服務器的責任範圍。 –
當然,但是主腳本代替處理操作只能創建一個鎖文件,然後當鎖文件存在時從cron運行的另一個腳本可以運行主進程。從cli通常調用的腳本沒有任何超時:) –
你應該更新答案來包含它。目前的措辭(*「主要腳本寫入progress.txt文件的進度」*)並沒有說明cron正在執行「主腳本」並尋找一個開始處理的信號。 –
。這需要使用exec()或proc_open()(http://php.net/manual/en/function.proc-open.php)來運行php腳本,並將輸出傳遞給一個文件(或者如果你想成爲額外多餘的花哨,用Node.js的偵聽數據)
有相當多的方式來實現這一點:
- Node.js的
- 一個Ajax查詢每x秒
- 元/ JavaScript頁面重新加載
- 是經常與它的地位重新加載一個IFRAME。
祝你好運!
您不應該在HTTP會話中完全執行長時間運行的進程。
這個問題的一個簡單和常見的方法是消息排隊。基本上,您的UI將請求排隊到數據庫表中,然後讓外部守護進程處理隊列。
要提供反饋,讓守護進程定期用它當前正在處理的行的狀態更新表。然後,您的JavaScript代碼可以向腳本發出AJAX請求,該腳本從數據庫中檢索該工作項的狀態並將其顯示給用戶。
你可以使用PHP的輸出緩衝(見ob_flush)衝在某些點的內容在你的劇本和定製你的JavaScript,以便它使用的刷新內容。我相信您的AJAX調用中的readyState在刷新時不會設置爲4,因此您必須自己處理它(請參閱this article)。我認爲它比寫入文件和檢查文件內容要好得多。
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
,收到的號碼,並把它交給你的進步酒吧...
沒有檢查我自己,但希望它的作品! :)
- 1. PHP腳本的JavaScript
- 2. PHP腳本得到一個循環
- 3. 從php腳本的javascript window.open
- 4. PHP腳本的Javascript變量
- 5. javascript變量到php腳本使用ajax
- 6. JSON從PHP到JavaScript腳本單qoutes
- 7. 獲得使用PHP腳本
- 8. 的jQuery得到腳本
- 9. 得到document's ID // PHP,JavaScript的
- 10. JavaScript變量爲PHP腳本
- 11. Javascript美化 - PHP腳本
- 12. 腳本JavaScript和PHP - 可變
- 13. JavaScript Geoserver調用PHP腳本?
- 14. 從JavaScript調用php腳本
- 15. 從javascript調用php腳本
- 16. 使得從PHP腳本點擊文本
- 17. shell腳本得到場
- 18. 嘗試使用JSON發送JavaScript以PHP腳本獲得包裝
- 19. 得到一個形式值,張貼到PHP腳本,並有PHP腳本程序中的錯誤和返回值
- 20. 如何將數據發佈到php腳本的javascript腳本中輸入變量?
- 21. 得到腳本源文件中的JavaScript URL參數HTML
- 22. PHP - 轉移到.PHP腳本發送javascript變量
- 23. 運行PHP腳本和JavaScript的onClick
- 24. 在php腳本中的Javascript提醒
- 25. PHP代碼中的JavaScript腳本標籤
- 26. 使用JavaScript的原型在PHP腳本
- 27. PHP/JavaScript的倒計時腳本
- 28. PHP函數腳本沒有得到調用的Joomla
- 29. 得到一個的mysql_query腳本訪問PHP網站
那麼,使用文件可以幫助,但它仍然不是我的夢想。 如果我需要經常從php-script獲取信息,該怎麼辦?對於文件系統來說這不會太昂貴嗎? – Dmitriy
讀取文件對於計算機來說是非常容易的。 – thatidiotguy