PHP - session_id () дает мне внутреннюю ошибку сервера HTTP / 1.1 500 - PullRequest
2 голосов
/ 15 февраля 2012

Запуск 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] , когда все обновляется [update.php] должен возвращать те же данные, которые показаны в [serverinfo.php] просто чтобы «обновить» «страницу» новыми данными, это делается:

update.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

Это просто показывает, что update.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 Ответ

3 голосов
/ 15 февраля 2012

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

Вопреки тому, что вы выяснили, я думаю, вы обнаружите, что на самом деле 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.

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

update.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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...