【问题标题】:Strange behaviour of php session_start() when javascript fetchjavascript fetch 时 php session_start() 的奇怪行为
【发布时间】:2018-04-20 23:36:18
【问题描述】:

为了描述我的问题,我写了 3 个简单的脚本:

  • index.php(启动会话并显示 html 链接);
  • index.js(包含链接点击处理程序,从 fetch.php 获取数据);
  • fetch.php(启动会话,发送响应)。

当我点击一个链接时,javascript 会向 fetch.php 发送一个请求。据我了解,cookie 也会发送,因为指定了“同源”。我期待在响应 session_id 中看到,但响应会在 7-9 秒后出现,并带有消息 Failed to load response data。为什么会发生?

PS。如果我从 fetch.php 中删除 session_start() 行,响应会立即返回。

PSS。如果我用 jQuery.post 替换 fetch,响应也会立即返回。

index.php

<?php
session_start();
?>

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8"/>
        <title>test</title>
    </head>
    <body>
        <a href="/">request</a>
        <script src="/index.js"></script>
    </body>
</html>

index.js

let a = document.querySelector('a');

a.addEventListener('click', (e) => {
    e.preventDefault();

    fetch('/fetch.php', {

        headers: { 

            'Content-Type': 'application/json',
        },
        method: 'POST',
        credentials: 'same-origin',
        body: JSON.stringify({

            data: 'data',
        }),
    }).then((response) => {

        console.log('Success');

    }).catch((errors) => {

        console.log('Error');
    });
});

fetch.php

<?php
session_start();

header('HTTP/1.1 200 Ok', true, 200);
header('Content-Type: application/json');

echo json_encode(array(

    'id' => session_id(),
));
?>

【问题讨论】:

  • 你数组中的逗号不会报错吗?
  • @Mouser 不,脚本不会抛出任何错误。
  • 检查你的服务器错误日志,你的脚本可能会出错,因此不会打印任何东西,否则你至少应该得到一些 json 打印输出
  • 输出data时在控制台看到什么
  • @Mouser 要检查来自 fetch.php 的响应,我正在使用 Chrome 开发人员工具,在响应选项卡中我什么也看不到(它是空的)。仅在 session_start() 问题中,如果我将其从脚本中删除,则响应正确发送。

标签: javascript php fetch-api


【解决方案1】:

问题仅出现在 Chrome 中。解决方案是在 fetch 中添加中间 json handler

}).then(function (response) {

    return response.json();

}).then(function (json) {

    console.log('Success');
    console.log(json);

}).catch(function (errors) {

    console.log('Error');
});

问题消失了。

【讨论】:

  • 这意味着您的回复根本不是空的。
  • @PatrickEvans 是的,据我了解,Chrome 在开发人员工具中没有显示这样的响应。这是一个 Chrome 错误。
猜你喜欢
  • 2011-07-02
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 1970-01-01
  • 2011-07-28
  • 2012-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多