Я пытаюсь создать простой в использовании API с php, но я столкнулся с несколькими проблемами. Я работаю над пользователем api, который делает основной материал CRUD.
Если я выполняю запрос POST с помощью cURL для моего пользователя api (user.php), во время выполнения user.php используется новый идентификатор сеанса.
Поэтому для борьбы с этим я попытался отправить текущий идентификатор сеанса с запросом POST на user.php. Проблема, с которой я столкнулся сейчас, заключается в том, что после установки идентификатора с session_id($_POST['session'])
а затем, начиная мой сеанс с 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);
}
?>
user.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, который не требует от меня отправки текущего идентификатора сеанса, если таковой имеется. Есть идеи?
ОБНОВИТЬ:
Посмотрите комментарий @Neok по моему вопросу. Это решение. Просто указывая на других, которые могут иметь такую же проблему.
Убедитесь, что php.ini установлен для регистрации всех ошибок
error_reporting(E_ALL);
или
ini_set('error_reporting', E_ALL);
Документация PHP говорит, что session_id()
возвращает идентификатор сеанса для текущего сеанса или пустую строку (""), если текущий сеанс отсутствует (текущий идентификатор сеанса отсутствует). Поэтому вместо того, чтобы принимать $_SESSION['id']
, попробуйте следующее:
// Check for available session
if (session_id() == "") {
header('location: index.php');
} else {
...
}
В противном случае ваш код перенаправляется на index.php в цикле, вызывающем ошибку 500.