2010-12-29 3 views
2

외부 프로그램 (ImageMagick의 gm)과 함께 축소판을 생성하기 위해 약간의 클래스를 만들었습니다. 계급은 exec()을 호출하여 gm.exe을 호출하지만 동시 실행이 있고 열린 PHP 세션이있을 때 httpd.exe이 고정되도록 PHP bug을 기록했습니다. 다음과 같은 임시 해결책이 있습니다.세션 감지에 권장되는 방법

session_write_close(); 
exec('gm convert -resize 100x100 source.jpg target.jpg'); 
session_start(); 

지금까지는 그렇게 좋았습니다. 이제 다른 현재 및 향후 프로젝트에서 미리보기 이미지 클래스를 다시 사용하고 싶습니다. 코드를 삭제하고 변경하지 않고 호출 할 수있게하려면 세션이 세션이 아닐 때 세션 해결 방법을 생략해야하며 프로그래밍 방식으로 처리해야합니다. 그렇지 않으면 내 썸네일 이미지 작성자가 자체적으로 세션을 시작하는 불쾌한 부작용을 갖게됩니다.

활성 세션이 있는지 제대로 감지 할 수 있습니까? 또는 다른 말로하면, 내 함수를 호출하는 PHP 스크립트가 session_id()에 대한 호출을 발행했는지 그리고 운영 체제가 세션 파일을 잠그고있는 열린 핸들을 보유하고 있으므로 세션을 닫지 않았거나 파괴하지 않았는지 여부 따라서 다른 실행중인 프로세스에서 액세스 할 수 없기 때문에 httpd.exe을 동결시킬 수 있습니다.

if(session_id()){ 
    session_write_close(); 
    exec('gm convert -resize 100x100 source.jpg target.jpg'); 
    session_start(); 
} 

하지만 스크립트가 지금까지 세션을 사용하는 경우 session_id()들이이 시점에서 활성화되지 않은 경우에도, 값을 반환하는 것으로 나타났습니다 :

나는 이것을 시도했습니다. 스크립트가 session_write_close() ...으로 세션을 닫으면 내 미리보기 이미지가 다시 열립니다!

답변

1

정말 그렇습니다. 이를 수행 할 수있는 기능이없는 것처럼 보입니다. http://www.php.net/manual/en/book.session.php

session_save_path()가 반환 한 디렉토리의 파일을 분석 할 수 있습니다. 그러나 다른 플랫폼과 비표준 세션 핸들러를 사용하여 문제를 안정적으로 수행하게 될 것입니다.

+0

'할 수 없다'는 경우는 괜찮은 대답입니다. 모두에게 감사 드려요. –

1

내가 찾은 유일한 방법은 session_regenerate_id()을 사용하는 것입니다. 활성 세션이 없으면 false를 반환합니다. 그러나 이것은 이전 세션 ID에 의존하는 스크립트가 중단 될 수 있다는 명백한 단점이 있습니다.

1

이렇게하려면 PHP 내에 방법이 없습니다. 세션이 처음 시작되었을 때 내 세션 시작 래퍼 함수가 설정 한 전역 변수 (bleah)를 확인하는 몇 가지 간단한 래퍼 함수를 ​​수행해야했습니다.

관련 문제