views:

825

answers:

3

I have two PHP scripts, both using the same session by calling session_name('MySessID').

When the first script calls the second script using curl, the second script hangs when session_start() is called.

Why would this happend?

+3  A: 

I don't totally understand why this happens, but I got it solved.

This bug describes the same problem I'm having. I have a scripts posting to another script, both using the same session, which apparently stalls PHP.

So, before I do the whole curl post script, I call the session_commit function, so ending the calling scripts session, and enabling the called script to restart the session.

Whack...

Jrgns
+3  A: 

From the php manual

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

Session data is usually stored after your script terminated without the need to call session_write_close(), but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking. You can reduce the time needed to load all the frames by ending the session as soon as all changes to session variables are done.

So you can not have 2 scripts use the same session att the same time.

A: 

I got bitten by this as well. I fixed it thanks to the info provided in stackoverflow.

I had two pages, both had "session_start()" at the top and the first was calling the second with curl so I could POST variables to the second script after validation. The webserver was hanging until I added "session_write_close()".

Code sample follows:

// 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();
Tom