2

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

我听说 cookie 信息随所有 HTTP 请求一起发送,但我发现 jquery 的 $.get() 和 $.post() 请求无法让接收的 PHP 文件读取 $_session 信息。

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

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

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

谢谢!

*更新*

我发现失败的是 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>
4

1 回答 1

0

我认为真正的问题在于 PHP 会话管理。如果你这样做session_start()就像你这样做一样fopen(SESSION_FILE, 'rw')- 换句话说,你正在打开会话文件进行写入。这对于第一个请求是可以的。但同时第二个请求被服务器接受并试图做同样的事情:打开会话文件进行写入。这将在许多系统上失败。但它仍然很奇怪,我希望第一个请求完成,而第二个请求等待第一个调用session_destroy()session_write_close()。一旦完成或超时,第二个请求可以访问会话并继续工作...... :)

于 2020-02-07T13:21:18.380 回答