javascript fetch 时 php session_start() 的奇怪行为

Posted

技术标签:

【中文标题】javascript fetch 时 php session_start() 的奇怪行为【英文标题】:Strange behaviour of php session_start() when javascript fetch 【发布时间】: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() 问题中,如果我将其从脚本中删除,则响应正确发送。 【参考方案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 错误。

以上是关于javascript fetch 时 php session_start() 的奇怪行为的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 fetch 在 javascript 中获取 php 错误消息

将 PHP 异常返回到 javascript FETCH API

PHP 和 Javascript 值传递

在本地主机上运行的 Vue 应用程序中使用带有 php 文件的 JavaScript fetch() - 相对 URL 问题

$_POST 未从 Javascript 的 Fetch() 中检索数据

使用 Fetch API 将数据发送到 PHP 服务器(首选 POST 方法和 JSON)