私は 2 つの PHP スクリプトを持っています。どちらも を呼び出して同じセッションを使用していsession_name('MySessID')
ます。
最初のスクリプトが curl を使用して 2 番目のスクリプトを呼び出すと、2 番目のスクリプトsession_start()
が呼び出されたときにハングします。
なぜこれが起こったのでしょうか?
PHPマニュアルより
http://php.net/manual/en/function.session-write-close.php
通常、セッション データは、session_write_close() を呼び出す必要なくスクリプトが終了した後に保存されますが、同時書き込みを防ぐためにセッション データがロックされるため、いつでも 1 つのスクリプトしかセッションで操作できません。フレームセットをセッションと一緒に使用すると、このロックにより、フレームが 1 つずつ読み込まれます。セッション変数へのすべての変更が完了したらすぐにセッションを終了することで、すべてのフレームをロードするのに必要な時間を短縮できます。
したがって、2 つのスクリプトで同じセッションを同時に使用することはできません。
なぜこれが起こるのか完全にはわかりませんが、解決しました。
このバグは、私が抱えている同じ問題を説明しています。両方とも同じセッションを使用して別のスクリプトに投稿するスクリプトがあり、明らかに PHP が停止します。
そのため、curl ポスト スクリプト全体を実行する前にsession_commit
関数を呼び出して、呼び出しスクリプト セッションを終了し、呼び出されたスクリプトがセッションを再開できるようにします。
ワック...
私もこれで噛まれました。stackoverflow で提供された情報のおかげで修正しました。
2 つのページがあり、どちらも上部に「session_start()」があり、1 つ目は curl で 2 つ目を呼び出していたので、検証後に 2 つ目のスクリプトに変数を POST できました。「session_write_close()」を追加するまで、Webサーバーはハングしていました。
コードサンプルは次のとおりです。
// 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();