제목 | strace 를 이용한 php 디버깅 | ||
---|---|---|---|
글쓴이 | fnmeat | 작성시각 | 2015/06/11 11:42:31 |
|
|||
ci 와는 무관한 내용이기는 한데 공유 차원에서 올려봅니다. php 디버깅시에 php 소스 내부에서 찾는것도 방법이지만 os 와 관련된 문제일 경우 찾는데 시간이 걸리는 경우가 있습니다. (네트워킹, io, system call 등) 또 php 가 소스를 어떻게 실행하고 있는지 궁금하기도 해서 찾아본 방법중의 하나가 strace 입니다. strace 는 시스템콜을 추적하는 디버깅 툴입니다. ci2 에서 세션 기능이 제대로 동작하지 않아서 사용하지 않고 있었는데 ci3 에서 어떻게 바뀌었나 봤습니다. ("This detail was at the root of many issues and the main reason why CodeIgniter 3.0 has a completely re-written Session library." 역시나 새로 만들었군요 ㅋㅋ 이번에는 써보려고 합니다.) 그래서 새 코드를 보던 중에 문득 궁금해서 sess_destory() 동작과정을 확인해봤습니다. ci 의 session->sess_destroy() 는 php 의 session_destroy() 를 실행합니다. /** * Session destroy * * Legacy CI_Session compatibility method * * @return void */ public function sess_destroy() { session_destroy(); }php 의 session_destroy() 레퍼런스를 보면 아래와 같은 설명이 있습니다. session_destroy() destroys all of the data associated with the current session그런데 destroy 라는 것이 무엇인지 모르겠습니다. 세션 값을 null 로 만든다는 건지 세션 파일을 없앤다는 건지 등등. strace 로 확인해봅니다. welcome.php $this->load->library("session"); $this->session->set_userdata("key", "val"); print_r($this->session->userdata()); $this->session->sess_destroy();php 동작을 확인하려면 콘솔에서 실행해야 하니 콘솔에서 php index.php 를 실행하면 에러가 나옵니다. session_destroy(): Trying to destroy uninitialized sessionFilenamesession 라이브러리 생성자를 보니 cli 모드를 막아놨군요. public function __construct(array $params = array()) { // No sessions under CLI if (is_cli()) { log_message('debug', 'Session: Initialization under CLI aborted.'); return; }welcome.php 에서 강제로 시작해줍니다. session_start(); $this->load->library("session"); $this->session->set_userdata("key", "val"); print_r($this->session->userdata()); $this->session->sess_destroy(); $ php index.php Array ( [key] => val )잘 나옵니다. 그러면 이제 strace 로 기록을 남깁니다. 옵션은 -f: child process 기록, -o x.log 저장할 파일 이 2개만 알아도 사용할 수 있습니다. $ strace -f -o a.log php index.php Array ( [key] => val )a.log 파일을 열어서 session 관련 콜을 찾습니다. 제 컴의 경우 session.save_path = /var/lib/php5 이니 /var/lib/php5 라는 문구로 검색합니다. $ grep -n "/var/lib/php5" a.log 1160:1507 open("/var/lib/php5/sess_q0eabmif4f5ub1o2a3nn4lrt86", O_RDWR|O_CREAT|O_LARGEFILE, 0600) = 3 1200:1507 unlink("/var/lib/php5/sess_q0eabmif4f5ub1o2a3nn4lrt86") = 0unlink 를 쓰는군요. 그렇다면 sess_destroy 는 세션 파일 자체를 delete 해버리는 방식이군요. 이제 속이 시원합니다. 위 내용이 맞다면 php 소스에서 unlink 코드를 검증할 수도 있겠는데 다음에 한번 써보겠습니다. |
|||
태그 | strace | ||
다음글 | myISAM와 innodb 엔진의 차이점을 잘 설명해놓... (3) | ||
이전글 | phpstorm과 xdebug 연동하기 (15) | ||
변종원(웅파)
/
2015/06/11 12:03:19 /
추천
0
시스템단 디버깅에 유용하겠네요. 감사합니다. ^^
|