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