1개의 사이트에서 2개의 탭을 열고 동시에 작업수행이 안되는 경우가 있다.
상황)
1) A탭
- 정산처리 등과 같이 오래 걸리는 작업을 실행.
2) B탭
- 상품정보나 다른 페이지를 보려고 눌렀을 경우 먹통이 되는 경우.
위와 같은 상황이 생기는데 이것은 PHP의 세션 세이프한 처리 때문이다.
즉, session_start(); 로 시작하는 모든 페이지에서는
한 세션에서는 하나의 작업만 처리 가능하다.
In a nutshell, how session works:
Client side: php is sending back to the client, a cookie with the id of the session. So, the session ends when the server ends to process the script and not when session_write_close() is executed. So, using session_write_close() for fast saving the session in the client side is useless unless you are ob_flush() and flush() to the customer.Server side: It could be changed but the normal behavior is to save the session information in a file. For example:
sess_b2dbfc9ddd789d66da84bf57a62e2000 file
**This file is usually locked**, so if two sessions are trying open at the same time, then one is freezed until the file is unlocked. session_write_close() ends the lock.
For example:
<?php
$t1=microtime(true);
session_start();
sleep(3);
session_write_close();
$t2=microtime(true);
echo $t2-$t1;
?>
If we run this code in two processes (using the same session, such as two tabs), then one will return 3 seconds while the other will return 6 seconds.
Its caused because the first process lock the session file.
However, changing to:
<?php
$t1=microtime(true);
session_start();
session_write_close();
sleep(3);
$t2=microtime(true);
echo $t2-$t1;
?>
both files runs at 3 seconds.
For PHP 7.0 and higher, we could use session_start(true); for auto close after the first read.
This operation is highly important for AJAX when we used to do many operations in parallel by using the the same session
- 출처 : http://php.net/manual/en/function.session-write-close.php
이것을 동시에 병렬처리 하기 위해서는 크리티컬 섹션(뮤텍스) 등을 걸지않고 풀어줘야 한다.
방법은 session_write_close(); 함수를 사용하면
뮤텍스를 해제하게 된다.
저 함수 호출이후 오래 걸리는 작업이나 원하는 작업등을 처리하는 로직을 작성하면 된다.
ex)
<?php
session_start();
session_write_close();
DoLongTimeWorks();
?>
'PHP' 카테고리의 다른 글
PHP에서 변수로 클래스 호출방법 (0) | 2018.04.14 |
---|