2012-05-23 38 views
0

奇怪的問題,我打開fsockopen()到一個頁面的連接, 該頁面有一個header(location:xx)到同一頁面(我只是刷新腳本),但它'似乎重定向不工作.. 。fsockopen()和標題(位置:xxx)在打開的腳本中?

顯然一切工作,如果我用瀏覽器複製它...

一些代碼:

連接頁面:

$socketcon = fsockopen($_SERVER['HTTP_HOST'],80,$errorno,$errorstr,10); 
if($socketcon) { 
    $socketdata = "GET http://www.example.com/test2.php HTTP/1.0\r\nHost: ".$_SERVER['HTTP_HOST']."\r\nConnection: Close\r\n\r\n"; 
    fwrite($socketcon,$socketdata); 
    fclose($socketcon); 
} 

相接頁(test2.php):

<? 
//other code (working fine) 

if($_GET["AAA"]){ 

    //REDIRECT WORKED ! 

} else { 
    header("location:test2.php?AAA=1"); //same page but with a get param 
} 
?> 

重定向加工部分從未得到執行......

有什麼建議?

編輯:連接必須是異步的

+0

您的當前解決方案無論如何不會起作用:一旦調用者腳本結束,連接將被丟棄。我想你想要AJAX。否則,沒有辦法。除非您使用JavaScript,否則您不能魔術般重定向斷開連接的客戶端。 – netcoder

+0

它已經工作的異步部分,即使我關閉瀏覽器(打開調用者腳本),使用套接字打開的腳本仍在運行...問題是我無法重定向套接字腳本 – NicolaPasqui

+0

當您的調用者腳本結束(即:在最後的'?>'結束標記處),套接字被關閉。你可能認爲它有效,但它沒有。除非使用JavaScript,否則您仍然會遇到重定向問題。除非你沒有正確地提出你的問題,並且你只想要一個'include'。 – netcoder

回答

1

考慮Is making asynchronous HTTP requests possible with PHP?這是一個類似的問題。

使用exec() - 如果您不需要返回值,家庭功能可能是一個不錯的選擇;你可以調用附加&的捲曲,它會在後臺運行。

如果你真的想要在PHP中做到這一點,你可以:產生一個新的進程(使用pcntl_fork())或自己處理重定向。

要處理重定向你需要:

  1. 確定你的響應代碼是看從流中讀取的前三個字母是什麼。 200意味着成功,300年代的任何事情都意味着部分成功。
  2. 在前三個字符中找到302(或307)後,搜索位置標題。我相信這將匹配正則表達式/\s*location:\s*(.+)$/m
  3. 驗證您在位置字段中的網址是否符合您的期望值且值得信賴。它應該是絕對URL,但您需要檢查它是否有安全的服務器,安全的端口,安全的URL和安全參數。 parse_url()可能派上用場,但不檢查潛在的安全問題
  4. 打開與上面匹配的新URL的新連接(或者,如果它是相同的主機,並且您使用Keep-Alive的HTTP 1.1,則重用您的連接)來發送適當的數據。
  5. 根據需要處理任何結果/清理。

你可以看到這是非常複雜的。這也將是遞歸的。你真正在說的是在PHP中編寫一個基本的HTTP解析器。這不是一個好主意 - 使用cURL並找到使其異步的其他方法。

+0

用exec()調用的腳本是否會像curl一樣跟着重定向? – NicolaPasqui

0

您的連接功能不處理重定向。

如果您想支持它,您必須親自編寫代碼,或使用類似curl的庫來建立連接。

+0

請看我的編輯 – NicolaPasqui

2

有什麼建議嗎?

是的,停止使用的插座做什麼cURL可以做的更好;)一個header('Location: X')實際上會送你一個301/303 HTTP響應,你(或瀏覽器)應通過新的請求處理。但是,您似乎無法處理重定向。另一方面,cURL模仿類似瀏覽器的功能,它可以遵循重定向使用curl_setopt($curlResource, CURLOPT_FOLLOWLOCATION, true);

+0

我忘了一件重要的事情,它必須是異步的,這就是爲什麼我沒有使用curl ... – NicolaPasqui

+0

@Il_pasqui如果你想繼續這個路徑,你必須自己處理重定向。順便一提; PHP是按順序執行的,這意味着您不會有異步請求,除非您並行執行腳本。 –

+0

我該如何處理重定向?我的意思是,很明顯,如果頁面被套接字打開,那麼標題(位置)不起作用...那麼,是否有其他選擇?我只需要重新執行腳本,我可以嘗試再次使用套接字進行連接,但這是一個糟糕的事情......謝謝! – NicolaPasqui