Почему session_start вызывает таймаут, когда один скрипт вызывает другой скрипт с использованием curl

У меня есть два скрипта 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();