Почему session_start вызывает тайм-аут, когда один скрипт вызывает другой скрипт, используя curl - PullRequest
5 голосов
/ 31 октября 2008

У меня есть два PHP-скрипта, оба используют один и тот же сеанс, вызывая session_name('MySessID').

Когда первый скрипт вызывает второй скрипт, используя curl, второй скрипт зависает при вызове session_start().

С чего бы это случилось?

Ответы [ 3 ]

12 голосов
/ 31 октября 2008

Из руководства по PHP

http://php.net/manual/en/function.session-write-close.php

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

Таким образом, вы не можете иметь 2 сценария, использующих один и тот же сеанс в одно и то же время.

7 голосов
/ 31 октября 2008

Я не совсем понимаю, почему это происходит, но я понял это.

Эта ошибка описывает ту же проблему, что и у меня. У меня есть сценарии, отправляемые на другой сценарий, , оба используют один и тот же сеанс , что, по-видимому, останавливает PHP.

Итак, перед тем, как выполнить весь сценарий curl post, я вызываю функцию session_commit, чтобы завершить сеанс вызывающих сценариев и позволить вызываемому сценарию перезапустить сеанс.

вжик ...

2 голосов
/ 22 января 2009

Меня это тоже укусило. Я исправил это благодаря информации, предоставленной в stackoverflow.

У меня было две страницы, на обеих было «session_start ()» вверху, а первая вызывала вторую с помощью curl, чтобы я мог POST-переменные ко второму сценарию после проверки. Веб-сервер зависал, пока я не добавил "session_write_close ()".

Пример кода:

// IMPORTANT (OR ELSE INFINITE LOOP) - close current sessions or the next page will wait FOREVER for a write lock.
session_write_close();

// We can't use GET because we can't display the password in the URL.
$host = $_SERVER['HTTP_HOST'];
$uri  = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
$url  = "http://$host$uri/formPage2.php?";

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url); //append URL
curl_setopt($ch, CURLOPT_POST,TRUE);//We are using method POST
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($_REQUEST, '', "&"));//append parameters    

curl_exec($ch); // results will be outputted to the browser directly
curl_close($ch);
exit();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...