2011-05-09 62 views
1

jQuery.ajax()是「請求結束時調用的函數」。假設我正在做一個Ajax請求ajax.php:什麼時候jQuery.ajax()完成{}?

<?php 

echo 'complete'; 

some_functions_that_echo_nothing(); 

?> 

將完整必須等待some_functions_that_echo_nothing()?如果是這樣,是否有辦法讓完整的{}直接在echo之後出現,並且仍然讓ajax.php一直運行到最後?

+0

只需結束HTTP響應。 – Raynos 2011-05-09 20:32:15

+0

是的,請求一直持續到PHP腳本執行結束。 – 2011-05-09 20:48:50

回答

2

嘗試調用HttpResponse::send();

+0

我不知道HttpResponse是如何工作的。它只是返回響應並保持腳本繼續?這對我來說似乎很奇怪。不會持有你的Apache線程。所以這會降低服務器的性能? – Eduardo 2011-05-11 01:11:47

+1

@eduardocereto。服務器接受一個包含所有數據的HTTP請求。然後你開始寫回應。 'echo'基本上是'HTTPResponse :: write()'。當您發送HTTP響應時,您將HTML直接發送回客戶端。然後你可以繼續做一些處理。一旦你到達文件的末尾,你的處理應該停止。所有這一切都是提前發回頁面,然後正常。 – Raynos 2011-05-11 08:01:14

+0

Apache線程怎麼樣? – Eduardo 2011-05-11 18:07:15

2

我猜你要輸出「完成」,並讓背景功能運行,因爲它是非常緩慢的。

在這種情況下,把這個功能放在一個單獨的文件中。讓它成爲proc.php並用這個代替:

<?php 
    echo "Complete'; 
    exec ("/usr/bin/php proc.php >/dev/null &"); 
?> 

這將立即返回並觸發proc.php文件在後臺運行。當然,它不能輸出它返回給用戶,所以它應該在用戶完成時郵寄給用戶,或者做他自己的持久性。

編輯ALWAYS採取格雷亞照顧你把裏面exec語句。如果您不是100%確定您正在非常仔細地對其進行消毒,請勿將用戶輸入放入其中。即使如此,您確實沒有充分的理由將用戶輸入用於撥打exec

+0

是否有任何理由將此用於Raynos的方法。我認爲儘可能避免系統調用 – babonk 2011-05-09 22:19:13

+0

對於我來說,結束頁面處理並開始一項新工作僅僅是爲了完成這項任務,我感覺更自然。這只是一個簡單的迴應,可能不是解決問題的最佳方案。 – Eduardo 2011-05-11 01:13:01

+1

更好的方法是避免sys調用,並將任務添加到隊列中,並有一個作業在cron上運行並從隊列中取出作業。 – Eduardo 2011-05-11 01:13:59

相關問題