PHP - session id() выдает мне внутреннюю ошибку HTTP/1.1 500 сервера


Запуск Apache с PHP в качестве FastCGI.

Serverinfo.php :

if (isset($_GET['session'])) {
    session_id($_GET['session']);
    session_start();
    die('You got here');
}

Я даже не доберусь до session_start (), потому что session_id () повесит "нить". Это сценарий:

Страница [serverinfo.php] показывает информацию о сервере, где вы также можете обновить информацию. При обновлении информации выполняется вызов AJAX [update.php] , когда все обновляется [обновление.php] должен возвращать те же данные, что и в [serverinfo.php] просто чтобы "обновить ""страницу" новыми данными, это делается с помощью:

Обновление.php :

if($update) {
    $serverinfo = file_get_contents('http://127.0.0.1/serverinfo.php?session=' . session_id() . '&name=' . $_GET['name']);
    print $serverinfo;
}

Причина, по которой я хочу повторно использовать внутреннюю $_SESSION, заключается в том, что мне нужно получить доступ к данным о клиенте для конкретной сессии, таким как имя пользователя и другие важные данные. В противном случае serverinfo.php просто выдаст мне: "войдите!"что он и должен делать :)

Я мог бы это сделать.: include_once ('serverinfo.на PHP'); и передать данные $_GET каким-то образом, но я не совсем уверен, сработает ли это или будьте все это эффективно:)

Accesslog от Apache :

127.0.0.1 - - [15/Feb/2012:11:03:15 +0100] "GET update.php?source=serverinfo&name=test HTTP/1.1" 500 544
127.0.0.1 - - [15/Feb/2012:11:03:15 +0100] "GET serverinfo.php?session=<session_id>&name=test HTTP/1.0" 500 544

Это просто показывает, что обновление.php фактически завершает обновления и пытается вызвать serverinfo.php, но он терпит неудачу с внутренней ошибкой сервера.

Журнал ошибок Apache :

[Wed Feb 15 11:03:55 2012] [warn] [client 127.0.0.1] mod_fcgid: read timeout from pipe
[Wed Feb 15 11:03:55 2012] [error] [client 127.0.0.1] Premature end of script headers: serverinfo.php

А вот и глобальный журнал ошибок :

[Wed Feb 15 11:04:04 2012] [warn] mod_fcgid: process 5584 graceful kill fail, sending SIGKILL
1 2

1 ответ:

Хорошо, читая между строк, я думаю, что знаю, что здесь происходит.

Вопреки тому, что вы выяснили, Я думаю, вы обнаружите, что на самом деле session_start() висит, и причина ошибки 500 заключается в том, что срок в конечном итоге истекает.

Причина зависания session_start() заключается в том, что update.php все еще имеет блокировку файла сеанса. В то время как у вас есть открытый сеанс, файл блокируется сценарием, который его открыл. Эту блокировку можно снять, закрыв данные сеанса с помощью session_write_close() - но это, вероятно, не то, что вы хотите сделать здесь.

Я бы сказал, что вы хотите сделать то, что вы предложили, и include 'serverinfo.php'; вместо того, чтобы вызывать его через HTTP. Это будет более эффективно - include делает значительно меньше работы, чем HTTP-запрос , - и это решит проблему сеанса. Вам не нужно "переходить" $_GET к serverinfo.php по двум причинам:
  1. $_GET является суперглобальным. Он автоматически доступен во всех возможных областях в рамках выполнения заданного сценария.
  2. когда файл включен, он наследует область, из которой он был включен. Это означает, что даже если $_GET не будь суперглобальным, он был бы по-прежнему доступен во включенном файле, поскольку он доступен в области, из которой был включен файл.

Если вы включаете файл, вам также не нужно беспокоиться о доступности данных сеанса, $_SESSION имеет те же суперглобальные свойства, что и $_GET.

Все, что вам нужно сделать, это:

Обновление.php

if ($update) {
    include 'serverinfo.php';
}

Serverinfo.php

die('You got here');
// $_GET['name'] has the same value here as it does in update.php
// Similarly, all the $_SESSION data is automatically available here