2012-03-20 41 views
1

我很新的PHP,我目前工作的一個服務,其中一部分包括短網址,我把一切都建立正常使用頭重定向: PHP - 發送HTTP重定向頭後,執行昂貴代碼

<?php 

if (code_exists($code)) { 
    // this code gets url for redirect: 
    $url_query = mysql_query("SELECT * FROM urls WHERE code = '".$code."'"); 
    $url = mysql_result($url_query,0,'url'); 
    $id = mysql_result($url_query,0,'url_id'); 

    // this code redirects user 
    header("Cache-Control: no-cache, must-revalidate"); 
    header("Expires: Thu, 1 Jan 1970 00:00:00 GMT"); 
    header("HTTP/1.1 301 Moved Permanently"); 
    header("Location: ".$url); 

    // this code executes a function, takes 3 - 4 seconds to return 
    $affected = dostuff($id); 

} else { 
    echo "Code Error: ".$code; 
} 

?> 

$affected = dostuff($id);正在調用幾個外部API並將結果寫入一個mysql表(通常爲100 +行)。

的問題是,因爲外部API和添加行需要幾秒鐘,用戶被重定向意思是不好的用戶體驗之前等待這一點。

有沒有我可以建立併發送標頭不執行代碼的用戶被暫停什麼辦法?

或者是有沒有「踢掉」另一個劇本,但它傳遞$id參數的方法嗎?

我寧願避免使用cron作業如果可能的話,因爲這些混淆了我的地獄:)。

任何幫助非常感謝。

+0

這是做這件事的一個壞方法。實現一些由cron運行的worker,並從你的php腳本中爲它添加任務。或者,優化'dostuff',以便在重定向之前執行並放置它需要一段時間 – zerkms 2012-03-20 21:10:16

+0

請查看http://stackoverflow.com/questions/1436575/can-a-php-script-trick-the-browser-進入思考的HTTP請求是 – sbstjn 2012-03-20 21:17:51

+0

我明白我承擔的方式是不理想的,但當我能夠設置cron作業等我可能有足夠的經驗內在功能目前我依靠API。這將讓我大量優化'dostuff'! – bendataclear 2012-03-20 21:40:34

回答

1

有這個可寫在這裏:https://www.zulius.com/how-to/close-browser-connection-continue-execution/

總之,你需要發送的頭告訴瀏覽器關閉連接,迫使HTTP服務器將數據發送到瀏覽器,並防止PHP從計時腳本出來。

這種方法的缺點是你的HTTP工作線程用完服務這一請求。有了足夠的請求,您可以輕鬆地用完工作線程以便能夠處理請求。另一種看待這種情況的方法是,如果有人想攻擊你的服務器,調用URL以儘可能快地啓動這個過程很快會使你的服務器癱瘓。

+0

我想這正是我要找的,謝謝gregmac,給出的鏈接對於完美的例子非常有用(對初學者非常有用)。這些腳本都在用戶身份驗證後面運行,所以如果我進入了線程運行的階段,我可以看看重寫。還要感謝@semu,在搜索時沒有找到此線程。 – bendataclear 2012-03-20 21:46:45

0

我認爲你需要創建工作線程執行的功能,並在完成更新您的數據庫狀態或觸發一個電子郵件給用戶。之後用戶可以回到狀態屏幕。