PHP: Sitzung auf einer Seite verwenden, ohne das Laden der Sitzung auf einer anderen Seite zu beeinträchtigen
P粉006977956
2023-08-08 13:05:15
<p>Ich verwende CURL, um eine große Datei von einer externen URL herunterzuladen und auf meinem Server zu speichern. Das kann mehrere Minuten dauern. Während des Downloads verwende ich curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,.., um eine anonyme Funktion auszuführen, die meine Variable $_SESSION['download_progress'] regelmäßig aktualisiert, um die aktuellen Download-Informationen zu erhalten. </p>
<p>All dies geschieht nun in der Datei upload.php, und während der Benutzer darauf wartet, dass die Datei heruntergeladen wird, verwende ich JavaScript, um die Seite progress.php anzufordern, die diesen einfachen Code enthält: </p>
<pre class="brush:php;toolbar:false;">session_start();
echo $_SESSION['download_progress'];</pre>
<p>Dadurch kann mein JavaScript-Code Informationen über den Fortschritt des Downloads anzeigen. </p>
<p>Aber es funktioniert nicht. </p>
<p>Die Seite „progress.php“ wird erst geladen, wenn „upload.php“ vollständig geladen ist (mit anderen Worten, zwei Seiten werden erst geladen, nachdem der Download der Datei abgeschlossen ist), was schlecht ist. session_start() verhindert irgendwie, dass die Seite „progress.php“ geladen wird. Ich verwende meinen eigenen Server (Apache PHP 5.4) und habe daher alle Administratorrechte. </p>
<p>Wie löse ich dieses Problem? Ich könnte einige unansehnliche Problemumgehungen verwenden, wie zum Beispiel das Schreiben der Download-Informationen in eine Textdatei statt in die Sitzungsvariable und dann die Verwendung von JavaScript, um diese Textdatei direkt zu lesen, aber das würde ich lieber nicht tun. Vielen Dank</p><p><br /></p>
你遇到的是基于文件系统的会话问题。上传脚本在执行期间锁定了会话后端文件,因此在释放锁之前无法访问会话信息。
最简单的一个是让您的上传脚本定期释放并重新锁定会话;同时,这会为你的进度脚本提供读取会话的机会。
要释放会话锁,请在上传脚本中的任何地方调用session_write_close。这样做会使你无法访问会话变量,直到以后再次调用session_start。您可以重复执行此周期。
还有其他更强大的解决方案。例如,您可以将进度信息移动到某个在脚本执行期间不会保持锁定的存储机制中;您可以根据会话ID来识别每个用户的信息(如果存在会话,您无需启动会话即可获得其ID)