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