2012-02-15 62 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