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

+ Recent posts