2012-02-15 64 views
2

以PHP作爲FastCGI運行Apache。PHP - session_id()爲我提供了HTTP/1.1 500內部服務器錯誤

serverinfo.php

if (isset($_GET['session'])) { 
    session_id($_GET['session']); 
    session_start(); 
    die('You got here'); 
} 

我甚至不會去在session_start(),因爲SESSION_ID()將掛起 「線程」。 這是場景:

頁面[serverinfo.php]顯示服務器信息,在那裏你可以更新信息。 當更新的信息,一個AJAX調用到[update.php],當一切都更新[update.php]應該返回[serverinfo.php]只是爲了顯示相同的數據「造

update.php:刷新」‘頁上的’新的數據,這是通過

if($update) { 
    $serverinfo = file_get_contents('http://127.0.0.1/serverinfo.php?session=' . session_id() . '&name=' . $_GET['name']); 
    print $serverinfo; 
} 

爲什麼我要重新使用內部$ _SESSION的原因是因爲我需要訪問有關特定會話的客戶端數據,例如用戶名和密碼d其他重要數據。 否則serverinfo.php會給我:「登錄!」它應該這樣做:)

我可以這樣做: include_once('serverinfo.php'); 有的通過$ _GET數據如何,但我不肯定是否將工作或全部是高效:)

ACCESSLOG Apache的

127.0.0.1 - - [15/Feb/2012:11:03:15 +0100] "GET update.php?source=serverinfo&name=test HTTP/1.1" 500 544 
127.0.0.1 - - [15/Feb/2012:11:03:15 +0100] "GET serverinfo.php?session=<session_id>&name=test HTTP/1.0" 500 544 

這只是表明該更新。 PHP實際上完成它的更新,並嘗試調用serverinfo.php,但它會因內部服務器錯誤而失敗。

Apache的錯誤日誌

[Wed Feb 15 11:03:55 2012] [warn] [client 127.0.0.1] mod_fcgid: read timeout from pipe 
[Wed Feb 15 11:03:55 2012] [error] [client 127.0.0.1] Premature end of script headers: serverinfo.php 

而這裏的全球錯誤日誌

[Wed Feb 15 11:04:04 2012] [warn] mod_fcgid: process 5584 graceful kill fail, sending SIGKILL 
+2

'update.py'看起來極像是PHP來我,而不是Python ... – DaveRandom 2012-02-15 10:37:40

+1

哈哈,該死的..我是一個Python開發者,大部分時間,我只是默認爲.py結束我的文件擴展ns :)糾正(謝謝) – Torxed 2012-02-15 10:56:28

+2

那麼你從哪裏得到500錯誤,從'serverinfo.php'或'update.php'?同時檢查Apache錯誤日誌 - 從HTTP 500,PHP或其他應用程序中,應該會記錄一條消息,告訴您爲什麼會出錯。 – DaveRandom 2012-02-15 11:08:43

回答

3

好吧,我想我知道是怎麼回事字裏行間。

與你已經確定的相反,我認爲你會發現它實際上是掛起的session_start(),並且500錯誤的原因是時間限制最終到期。

session_start()掛起的原因是因爲update.php仍然會鎖定會話文件。當您打開一個會話時,該文件被打開的腳本鎖定。您可以通過關閉session_write_close()關閉會話數據來釋放此鎖定 - 但這可能不是您想要在此處執行的操作。

我想說,你想要做的是你所建議的,而include 'serverinfo.php';而不是通過HTTP調用它。這將更有效率 - include比HTTP請求做的工作少得多 - 它將解決會話問題。你並不需要「通」 $_GETserverinfo.php的原因有兩個:

  1. $_GETsuperglobal。它在給定腳本執行過程中的每個可能範圍內自動可用。
  2. 當包含文件時,它會繼承它所包含的範圍。這意味着,即使$_GET不是超全球,它仍然仍在在包含的文件中可用,因爲它在包含該文件的範圍內可用。

如果包含了文件,你也不必擔心使得會話數據可用,$_SESSION具有相同的超全局屬性$_GET

所有你需要做的是:

update.php

if ($update) { 
    include 'serverinfo.php'; 
} 

serverinfo.php

die('You got here'); 
// $_GET['name'] has the same value here as it does in update.php 
// Similarly, all the $_SESSION data is automatically available here 
+0

最常見的最簡單的解決方案可以創造奇蹟.. 這是其中之一,我甚至不知道爲什麼我沒有嘗試之前,我打擾你們。 再次,謝謝!完美工作。 現在剩下的只是一些未被執行的AJAX代碼,因爲它應該是:P – Torxed 2012-02-15 11:44:31