我有兩個PHP腳本,都使用同一個會話調用session_name('MySessID')
。爲什麼session_start在一個腳本使用curl調用另一個腳本時會導致超時
當第一個腳本使用curl調用第二個腳本時,第二個腳本在調用session_start()
時掛起。
爲什麼會發生這種情況?
我有兩個PHP腳本,都使用同一個會話調用session_name('MySessID')
。爲什麼session_start在一個腳本使用curl調用另一個腳本時會導致超時
當第一個腳本使用curl調用第二個腳本時,第二個腳本在調用session_start()
時掛起。
爲什麼會發生這種情況?
我不完全明白爲什麼發生這種情況,但我解決了它。
這個bug描述了我遇到的同樣的問題。我有一個腳本發佈到另一個腳本,都使用相同的會話,這顯然阻止PHP。
因此,在執行整個捲曲後處理腳本之前,我會調用session_commit
函數,以便結束調用腳本會話並啓用被調用腳本以重新啓動會話。
捶......
從PHP手冊後,您的腳本終止,而無需調用session_write_close(
http://php.net/manual/en/function.session-write-close.php
的會話數據通常存儲),但作爲會話數據被鎖定爲了防止併發寫入,只有一個腳本可以在任何時候在會話上運行。將幀集與會話一起使用時,由於此鎖定,您將體驗逐幀加載的幀。只要完成對會話變量的所有更改,就可以通過結束會話來縮短加載所有幀所需的時間。
所以你不能有2個腳本在同一時間使用相同的會話。
我也被這個咬傷了。我解決了它,感謝在stackoverflow中提供的信息。
我有兩個頁面,都在頂部有「session_start()」,第一個用curl調用第二個頁面,所以我可以在驗證後將變量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();