【发布时间】:2016-02-01 14:40:51
【问题描述】:
我正在尝试使用 php 创建一个简单易用的 API,但我遇到了多个问题。我正在开发一个执行基本 CRUD 内容的用户 api。
如果我使用 cURL 向我的用户 api (user.php) 发出 POST 请求,则会在执行 user.php 期间使用新的会话 ID。
为了解决这个问题,我尝试将当前会话 ID 与 POST 请求一起发送到 user.php。我现在遇到的问题是,在使用session_id($_POST['session']) 设置id 然后使用session_start() 开始我的会话后,我的服务器将在执行该代码时卡住并最终抛出内部服务器错误500。
我试图让我的服务器向我显示ini_set('display_errors', 1); 和一个 .htaccess 文件(内容:php_flag display_errors 1)的错误,但无济于事,服务器只是卡住了。
test.php
<?php
session_start();
// Check for available session
if (!isset($_SESSION['id'])) {
header('location: index.php');
} else {
// Initialize cURL
$curl = curl_init();
// Set parameters for POST request
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://localhost/api/user.php',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => http_build_query([
'session' => session_id(),
'username' => 'testuser',
'password' => 'testalot',
'name' => 'testuser',
'isAdmin' => 0
])
]);
// Execute POST request
$response = curl_exec($curl);
/* <<< Doesn't get beyond this point. */
// Dump JSON
var_dump($response);
// Close cURL session
curl_close($curl);
}
?>
用户.php
<?php
// Declare integer checking function
function isInteger($input) {
return ctype_digit(strval($input));
}
// Declare result object
$output = ['success' => false, 'data' => [], 'error' => ''];
// Action on POST
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
// Check if session id was sent
if (!empty($_POST['session'])) {
// Set session id
session_id($_POST['session']);
// Start session with received session id
session_start();
/* <<< Freezes at this point. */
// Check session for available user id
if (isset($_SESSION['id'])) {
// Only admins are allowed to execute POST requests
if ($_SESSION['isAdmin'] == 1) {
// ... more code ...
我当然也会使用不同的方法来访问我的 API,不需要我发送当前会话 ID(如果有的话)。有什么想法吗?
更新:
在我的问题下查看@Neok 的评论。这就是解决方案。只是为可能有同样问题的其他人指出。
【问题讨论】:
-
在页面开头添加此代码行以报告错误。它可能会有所帮助。 error_reporting(E_ALL);
-
您可以尝试发送 $_SESSION['id'] 而不是 session_id() 吗?并注释掉 session_start();在用户 php?
-
@Neok 我正在调查。
-
首先你必须检查 echo session_id()。它返回的东西?。