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 ответ:
Хорошо, читая между строк, я думаю, что знаю, что здесь происходит.
Вопреки тому, что вы выяснили, Я думаю, вы обнаружите, что на самом делеsession_start()
висит, и причина ошибки 500 заключается в том, что срок в конечном итоге истекает.Причина зависания
Я бы сказал, что вы хотите сделать то, что вы предложили, иsession_start()
заключается в том, чтоupdate.php
все еще имеет блокировку файла сеанса. В то время как у вас есть открытый сеанс, файл блокируется сценарием, который его открыл. Эту блокировку можно снять, закрыв данные сеанса с помощьюsession_write_close()
- но это, вероятно, не то, что вы хотите сделать здесь.include 'serverinfo.php';
вместо того, чтобы вызывать его через HTTP. Это будет более эффективно -include
делает значительно меньше работы, чем HTTP-запрос , - и это решит проблему сеанса. Вам не нужно "переходить"$_GET
кserverinfo.php
по двум причинам:
$_GET
является суперглобальным. Он автоматически доступен во всех возможных областях в рамках выполнения заданного сценария.- когда файл включен, он наследует область, из которой он был включен. Это означает, что даже если
$_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