PHP - session_id()给我HTTP / 1.1 500内部服务器错误

时间:2012-02-15 10:35:59

标签: php ajax apache cgi sessionid

使用PHP作为FastCGI运行Apache。

serverinfo.php

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

我甚至不会访问session_start()因为session_id()会挂起“线程”。 这是场景:

页面 [serverinfo.php] 显示服务器信息,您也可以在其中更新信息。 更新信息时,会对 [update.php] 进行AJAX调用,当所有内容都更新时 [update.php] 应该返回<中显示的相同数据strong> [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的原因是因为我需要访问特定会话的客户端数据,例如用户名和其他重要数据。 否则serverinfo.php会给我:“登录!”它应该做的事情:))

我能做到: include_once( 'serverinfo.php'); 并传递$ _GET数据一些如何,但我不太确定这是否会起作用或效果如何:)

来自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

这只是表明update.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

1 个答案:

答案 0 :(得分:3)

好的,在线之间阅读,我想我知道这里发生了什么。

与您所确定的内容相反,我认为您会发现它实际上是session_start(),而500错误的原因是时间限制最终会过期。

session_start()挂起的原因是因为update.php仍然锁定了会话文件。当您有一个打开的会话时,该文件被打开的脚本锁定。您可以通过使用session_write_close()关闭会话数据来释放此锁定 - 但这可能不是您想要在此处执行的操作。

我想说你想要做的就是你所建议的,include 'serverinfo.php';而不是通过HTTP调用它。这将更有效 - include比HTTP请求的工作少得多 - 它将解决会话问题。您无需将$_GET“传递”到serverinfo.php,原因有两个:

  1. $_GETsuperglobal。它在给定脚本的执行中的每个可能范围内自动可用。
  2. 包含文件时,它会继承包含该文件的范围。这意味着即使$_GET 不是超全局,它仍然仍然在包含的文件中可用,因为它在文件范围内可用包括在内。
  3. 如果您包含该文件,您也无需担心会话数据的可用性,$_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