Why does session_start cause a timeout when one script calls another script using curl

前端 未结 3 1045
一整个雨季
一整个雨季 2020-12-10 18:22

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

相关标签:
3条回答
  • 2020-12-10 18:29

    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...

    0 讨论(0)
  • 2020-12-10 18:46

    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();
    
    0 讨论(0)
  • 2020-12-10 18:47

    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.

    0 讨论(0)
提交回复
热议问题