从异步请求中读取PHP会话数据

时间:2013-07-05 20:18:16

标签: php jquery ajax session

当从javascript到php文件进行异步调用时,如何确保php $ _session信息(我相信是基于cookie的)与异步请求一起发送?

我听说过所有HTTP请求都会发送cookie信息,但我发现jquery的$ .get()和$ .post()请求无法允许接收PHP文件读取$ _session信息。 / p>

接收php文件试图以正常方式读取$ _session信息:

session_start();
if(isset($_SESSION['user'])){
.....

如果通过Web浏览器直接访问接收php文件,则可以访问会话信息。

谢谢!

* update *

我发现session_start()命令失败了。该命令导致以下文件返回“0”而不是预期的“无会话可用”响应。

whois.php:

 $s = session_start();
 if($s){
    if(isset($_SESSION['user'])){
        if(isset($_POST['name'])){
            echo $_SESSION['user']." ".$_POST['name'];
        }elseif(isset($_GET['name'])){
            echo $_SESSION['user']." ".$_GET['name'];
        }
    }else{
        echo 'no user specified';
    }
 }else{
    echo 'no session available';
 }

为了彻底,我通过其直接URL导航到Web浏览器中测试了上面的php文件,并访问了php会话并输出了正确的响应。我想知道为什么它不能异步工作......

根据Pekka的要求,这是发出异步请求的php文件:

 <?PHP
 session_start();
 if(isset($_GET['user'])){
    $_SESSION['user'] = $_GET['user'];
 }

 ?>

 <html>
 <head>
 <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js"></script>
 <script type="text/javascript">
    $(document).ready(function(){
        $("#response").html('---');

        $("#form").submit(function(){
            var formData = $(this).serialize();

            $.post("whois.php",formData,function(data){
                $("#response").html(data);
            });

            return false;
        });
    });
 </script>
 </head>
 <body>
    <form id="form">
        <input name="name" type="text"/>
        <input name="submit" type="submit"/>
    </form>
    <div id="response">
    </div>
 </body>
 </html>

1 个答案:

答案 0 :(得分:0)

我认为真正的问题出在PHP会话管理中。如果您执行session_start(),就和执行fopen(SESSION_FILE, 'rw')一样,换句话说,您正在打开会话文件进行写入。对于第一个请求,这没关系。但是在同一时间,服务器接受了第二个请求,并尝试完全一样:打开会话文件进行写入。这将在许多系统上失败。但是仍然很奇怪,我希望第一个请求能够完成,而第二个请求是waitig,第一个请求可以调用session_destroy()session_write_close()。一旦完成或超时,第二个请求便可以访问该会话并继续工作...:)