PHP: 다른 페이지의 세션 로드를 방해하지 않고 페이지의 세션 사용
P粉006977956
2023-08-08 13:05:15
<p>CURL을 사용하여 외부 URL에서 대용량 파일을 다운로드하고 내 서버에 저장하고 있습니다. 몇 분 걸릴 것이다. 다운로드하는 동안 나는 컬_setopt($ch, CURLOPT_PROGRESSFUNCTION,..을 사용하여 익명 함수를 실행하고 내 $_SESSION['download_progress'] 변수를 주기적으로 업데이트하여 현재 다운로드 정보를 얻습니다.</p>
<p>이제 이 모든 작업은 upload.php 파일에서 발생하며 사용자가 파일이 다운로드되기를 기다리는 동안 저는 JavaScript를 사용하여 다음과 같은 간단한 코드가 포함된 Progress.php 페이지를 요청합니다. </p>
<pre class="brush:php;toolbar:false;">session_start();
echo $_SESSION['download_progress'];</pre>
<p>이렇게 하면 JavaScript 코드가 다운로드 진행 상황에 대한 정보를 표시할 수 있습니다. </p>
<p>단, 작동하지 않습니다. </p>
<p>"progress.php" 페이지는 "upload.php"가 로드를 완료할 때까지 로드되지 않습니다(즉, 파일 다운로드가 완료된 후 두 페이지가 로드됩니다). 이는 좋지 않습니다. session_start()는 어떻게든 "progress.php" 페이지가 로드되는 것을 방지합니다. 저는 자체 서버(apache php 5.4)를 사용하고 있어서 모든 관리자 권한을 가지고 있습니다. </p>
<p>이 문제를 어떻게 해결하나요? 다운로드 정보를 세션 변수 대신 텍스트 파일에 쓴 다음 JavaScript를 사용하여 해당 텍스트 파일을 직접 읽는 등 보기 흉한 해결 방법을 사용할 수도 있지만 그렇게 하지 않는 것이 좋습니다. 감사합니다</p><p><br /></p>
파일 시스템 기반 세션 문제가 발생하고 있습니다. 업로드 스크립트는 실행 중에 세션 백엔드 파일을 잠그므로 잠금이 해제될 때까지 세션 정보에 액세스할 수 없습니다.
가장 간단한 방법은 업로드 스크립트를 정기적으로 해제하고 동시에 세션을 다시 잠그는 것입니다. 이렇게 하면 진행 스크립트에서 세션을 읽을 수 있는 기회를 얻을 수 있습니다.
세션 잠금을 해제하려면 업로드 스크립트의 아무 곳에서나 session_write_close를 호출하세요. 이렇게 하면 나중에 session_start가 다시 호출될 때까지 세션 변수에 액세스할 수 없습니다. 이 주기를 반복할 수 있습니다.
다른 더 강력한 솔루션이 있습니다. 예를 들어 스크립트 실행 중에 잠금을 유지하지 않는 일부 저장 메커니즘으로 진행 정보를 이동할 수 있습니다. 세션 ID를 기반으로 각 사용자의 정보를 식별할 수 있습니다. 세션이 존재하는 경우 세션을 시작할 필요가 없습니다. ID를 받으세요 )