2012-12-17 88 views
0

在PHP腳本中執行其餘代碼之前,我想將http狀態(200 OK)發送到調用腳本。對於發送狀態碼,我使用的是HTTP/1.1 200 OK,但是在整個腳本完成執行後它會發送狀態,這會使調用腳本等待。我不確定這是否可能。任何幫助?php - 在執行代碼之前發送HTTP狀態

詳細說明:假設我有兩個腳本,a.php和b.php。 a.php正在調用b.php並等待http狀態,如果它是200則繼續執行其他操作。我希望b.php腳本能夠在被調用後立即發回200響應,然後繼續使用自己的代碼。

謝謝!

編輯: 閱讀評論後,我明白我想做的事是一個壞主意。然而,讓我說出爲什麼我在想這件事,並且可以這樣做。

a.php將有一個網絡界面,人們可以上傳他們的圖片,上傳完成後,a.php調用b.php,它使用這些圖像做一些處理。我希望a.php繼續,而不是掛/等待b.php完成,以防萬一b.php失敗,我想我可能會「推」一個錯誤,以便a.php可以提示用戶關於失敗。應該使用不同的線程?

+0

你怎麼知道在你做任何事情之前狀態是否會好?如果狀態爲* always * OK,並且您不關心結果,則您的其他腳本可以在後臺執行請求。那麼響應何時進入並不重要。 – deceze

+2

使用這種設計,如果B失敗,則A仍然會收到200,並繼續進行,就像沒有發生錯誤一樣。這甚至無法檢查狀態。 –

+0

請看編輯的問題,我在想我應該使用線程,任何建議? – ankitsingh

回答

1

PHP肯定可以做到這一點,但它是一個有點棘手。

ignore_user_abort(true); 
header("Content-Length: 0"); 
header("Connection: Close"); 
flush(); 
session_write_close(); 

// do something that takes very long 

這是您需要的最小代碼。如果你沒有會話,你可以離開最後一次通話。

一旦你關閉了連接,你不能發送更新,所以如果你想做一些錯誤報告,你必須找到另一種方式。

0

你有像flush()這樣的功能,可以滿足您的需求,但需要注意一些注意事項。閱讀更多:http://php.net/manual/en/function.flush.php

由於您在代碼中調用PHP腳本,因此您不必擔心列出的瀏覽器問題。但是如果啓用了類似mod_gzip的東西,這是不可能的。

0

如果你的a.php想讓b.php異步運行,你可以考慮使用cURL POST方法來啓動腳本。 a.php可以將超時設置爲1秒,並且cURL會話將停止。並且b.php將繼續運行,同時a.php也繼續運行。

+1

我在這裏看到一些關於gzip和flush的評論。這些似乎適用於瀏覽器輸出,而不是頭文件;頭文件立即發送,而不考慮緩衝。而cURL完全有能力處理GZIP。 –

+0

如果將超時設置爲一秒,則甚至不能保證該腳本將開始運行,更少的情況下在請求中止時繼續運行。 – deceze

+0

並不立即發送頭文件,它們通常會在第一次輸出時發送,然後立即發送。 – deceze

1

嗯,聽起來像你可能會更好使用允許基於套接字連接的東西。檢查NodeJS。我認爲PHP也可以支持某種形式的基於套接字的連接。你正在嘗試使用「沖洗」實際上是非常糟糕的做法。 PHP並不是爲多種有效載荷設計的,如果你使用的是AJAX,你將遇到一系列問題。

0

a.php只會是調用b.php並等待一個HTTP狀態,如果是200然後進行做別的事情

簡短的回答是,你無法控制時,Web服務器刷新它的緩衝區。因此,您需要繞過Web服務器來調用b.php。問題是,如果你通過exec/system/etc調用它,那麼b.hpp將成爲a.php的子進程 - which is a really bad idea如果b.php將花費任何時間完成。

既然你需要採取完全不同的策略,以實現一個解決問題的辦法,這是ciriticall重要的是要知道爲什麼你想讓它它任何有用的工作(當它是之前發出無條件200個狀態最有可能失敗它正在做有用的工作)。

根據您提供的信息(這不是一件好事),實現此目的的唯一可靠方法是通過消息隊列(以及在守護進程中運行的定製訂戶) - 假設您可以用成功復位狀態碼的入隊操作。但這有它自己的複雜性。

2

我想AJAX或XMLRPC,但作爲@Andrew說PHP不是那樣工作..是的NodeJS真是一個不錯的選擇......