2010-11-29 2 views
0

나는 PHP에서 무거운 이미지 조작을하고있어, 어떻게 진행되고 있는지 사용자에게 보여주고 싶습니다. 그래서 나는이 같은 일을 시도 :세션을 사용하여 무거운 PHP의 진행

for($i = 0; $i < $rowCount; $i++) { 
    session_start(); 
    $_SESSION['progress'] = $i/ $rowCount; 
    session_write_close(); 

    processLine($i); 
} 

을 그리고 내가 AJAX는 기본적으로 $ _SESSION [ '진보']의 값을 반환 다른 PHP 파일 호출을 사용하고 있습니다. 문제는 설정되지 않았습니다. 파일 당 두 번 이상 세션을 시작해서는 안되기 때문입니까? 방금 세션을 열고 각 행 사이를 닫지 않으면 SESSION 변수가 잠기고 전체 이미지 조작이 완료 될 때까지 폴링 파일이 처리되지 않습니다.

세션을 사용하여 작동하도록하는 방법은 없나요? 데이터베이스 나 파일에 진행 상황을 넣으면 작동하는 것 같지만 속도가 느리고 사용자를 식별하는 데 약간의 작업을해야합니다 (ips 또는 세션 ID 사용). 세션을 사용하면 이러한 일이 처리됩니다.

답변

1

이것은 PHP가 세션 파일을 잠그기 때문입니다. 동일한 세션을 계속 사용하는 첫 번째 프로세스가 파일을 잠그면 Ajax 호출은 동일한 세션 ID를 사용하므로 동일한 세션 파일에 액세스하려고하지만 첫 번째 프로세스가 완료 될 때까지 php에 의해 잠겨 있기 때문에 그렇게 할 수 없습니다.

귀하의 질문에 대한 답변입니다. 문제를 해결하는 방법을 알고 싶다면 확실하지 않습니다. 생각해야합니다.

+0

네, 그게 문제라고 생각 했어요. 그래서 프로세스에서 세션을 잠금 해제 할 수 없으므로 다른 프로세스에서 진행 상황을 확인하는 데 사용할 수 있습니다. – marcusklaas

+0

아니요. 예를 들어, 처리중인 이미지 이름의 이름을 따온 임시 파일을 만든 다음 해당 임시 파일에 진행률을 저장하면 Ajax가 anot에 액세스해야합니다. checkstatus.php? f = filename – Dmitri

+1

또한 memcache를 사용하는 경우 진행 결과를 memcache에 저장하는 것이 훨씬 빠르고 빠르며 임시 파일을 사용하는 것보다 빠릅니다. – Dmitri

0

솔직히 말해서 기능을 사용하는 각 PHP 스크립트의 맨 위에는 session_start(); 함수가 있어야합니다. session_write_close(); 같은 다른 모든 session_start 및 기타 모든 세션 함수를 제거하십시오.

세션을 닫지 않거나 필요하지 않은 다른 것을 사용하지 마십시오. 값이 반환되지 않으면 반환 된 PHP 오류 또는 파일 디렉토리의 error_log 파일을 확인하기 위해 브라우저의 JavaScript 콘솔을 다시 검사 할 수 있습니다.

그렇지 않으면 모든 것이 예상대로 작동합니다. 나는 과거에 비슷한 종류의 일을 해왔고 잘 돌아갔다. 이 방법으로 문제를 디버그하는 데 도움이되기를 바랍니다.

+0

아니요, 실제로이 문제가 해결되지 않습니다. 왜냐하면 두 개의 PHP 파일이 같은 시간에 같은 세션에서 작동하지 않기 때문입니다. (나는 여전히 내 이미지 조작을 이런 식으로하고있는 동안 진행 변수의 값을 읽을 수 없습니다 .. – marcusklaas

+0

동일성이 있어야 이상합니다. 세션이 이미지 조작 스크립트가 실행을 마칠 때까지 세션 값을 전역 적으로 업데이트하지 않는 한 읽기/쓰기로 두 번 열렸습니다. 세션을 시작하고 이미지 조작 스크립트가 실행되기 전에 해당 변수를 0 퍼센트로 설정하려고 시도했을 수 있습니다. 그래, 아직 시도하지 않았 으면 좋겠어. –

관련 문제