У меня есть два скрипта PHP, которые используют один и тот же сеанс, вызывая session_name('MySessID')
.
Когда первый скрипт вызывает второй скрипт с использованием curl, второй скрипт зависает при вызове session_start()
.
Почему это произойдет?
Из руководства по php
http://php.net/manual/en/function.session-write-close.php
Данные сеанса обычно сохраняются после завершения вашего сценария без необходимости вызова session_write_close (), но поскольку данные сеанса заблокированы для предотвращения одновременной записи, только один скрипт может работать в сеансе в любое время . При использовании наборов фреймов вместе с сеансами вы будете наблюдать за загрузкой кадров по одной из-за этой блокировки. Вы можете сократить время, необходимое для загрузки всех кадров, завершив сеанс, как только будут выполнены все изменения в переменных сеанса.
Таким образом, вы не можете использовать 2 скрипта в один и тот же сеанс одновременно.
Я не совсем понимаю, почему это происходит, но я решил его решить.
Эта ошибка описывает ту же проблему, что и у меня. У меня есть сценарий, отправляющий на другой скрипт, оба с использованием того же сеанса , который, по-видимому, закрывает PHP.
Поэтому, прежде чем я сделаю весь скрипт с curl post, я вызываю функцию session_commit
, поэтому заканчиваю сеанс вызывающих скриптов и позволяя вызываемому сценарию перезапускать сеанс.
Вжик …
Меня тоже укусил. Я исправил это благодаря информации, предоставленной в stackoverflow.
У меня было две страницы, у обоих была «session_start ()» вверху, а первая вызывала вторую с завитком, поэтому после проверки я мог передавать переменные 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();