php cli 로 된 프로그램이 지나치게 시스템 리소스를 잡아먹는거 방지하기 위해 timeout을 거는 경우가 있는데,
실제로 적용이 잘 안됨

CLI SAPI max_execution_time은 0으로 하드코딩 되어 있기 때문인데,
이 경우 timeout 이라는 shell command를 이용해서 처리함

sleep.php

<?php

    define('_SLEEP', 5);


    for ($i = 0; $i < _SLEEP; $i++)

    {

        echo "{$i}\n";

        sleep(1);

    }

    exit(0);

?> 


timeout_test.php

<?php

set_time_limit(4);


for ($i = 0; $i < 3; $i++)

{

    echo "{$i}\n";

    sleep(1);

}


echo "-- S result --\n";

echo shell_exec('php ./sleep.php');

echo "-- E result --\n";


echo "{$i}\n";


exit(0);

?> 


timeout이 4초인데도 불구하고 전체 실행 다 됨 <= cli에서 set_time_limit() 안먹음
CLI SAPI max_execution_time은 0으로 하드코딩 되어 있음

$ php timeout_test.php 

0

1

2

-- S result --

0

1

2

3

4

-- E result --

3

$


아래와 같이 timeout라는 shell command를 이용해서 실행가능함
4초가 넘어가는 경우에는 프로세스를 kill 해버림

$ timeout 4 php timeout_test.php 

0

1

2

-- S result --

$



아래 두 명령으를 동시해 실행해 봤을때 timeout이 걸렸을때 자식프로세스(sleep.php)까지 같이 kill 함

$ timeout 5 php timeout_test.php 

0

1

2

-- S result --
$


$ ps -ef | grep php

kilim     3346 32307  0 15:28 pts/14   00:00:00 timeout 5 php timeout_test.php

kilim     3347  3346  0 15:28 pts/14   00:00:00 php timeout_test.php

kilim     3349  3347  0 15:28 pts/14   00:00:00 sh -c php ./sleep.php

kilim     3350  3349  1 15:28 pts/14   00:00:00 php ./sleep.php

$

$ ps -ef | grep php

$

 

'PHP' 카테고리의 다른 글

외부 접속 지연 timeout - default_socket_timeout  (0) 2012.01.31
Posted by 광장군
,
프로그램에서 외부 호스트 접속이 필요한 경우가 있는데, 이 경우 외부접속이 지속되면 해당 프로그램에 악영향을 주는 경우가 있다.

아래와 같이 default_socket_timeout을 설정해서 외부접속지연을 막을 수 있다.

http://test_host/sleep.php

<?php

    define('_SLEEP', 5);


    for ($i = 0; $i < _SLEEP; $i++)

    {

        echo "{$i}\n";

        sleep(1);

    }

    exit(0);

?>



default_socket_timeoue_test.php <= set enough time

<?php

ini_set('default_socket_timeout', 10);

echo "-- S result --\n";

$rFp = @fopen('http://test_host/sleep.php', 'r');

if ($rFp !== false)

{

    stream_set_timeout($rFp, 2);

    stream_set_blocking($rFp, 0);

    $sResult = fread($rFp, 4096);

    echo $sResult;

    fclose($rFp);

}

echo "-- E result --\n";


exit(0);

?>

$ php default_socket_timeoue_test.php 

-- S result --

0

1

2

3

4

-- E result --



default_socket_timeoue_test.php <= set NOT enough time

<?php

ini_set('default_socket_timeout', 2);

echo "-- S result --\n";

$rFp = @fopen('http://test_host/sleep.php', 'r');

if ($rFp !== false)

{

    stream_set_timeout($rFp, 2);

    stream_set_blocking($rFp, 0);

    $sResult = fread($rFp, 4096);

    echo $sResult;

    fclose($rFp);

}

echo "-- E result --\n";


exit(0);

?>

$ php default_socket_timeoue_test.php 

-- S result --

-- E result --



* 위와 같이 default_socket_timeout 을 설정하면 해당 시간안에 socket data 못받아오면 socket close 시킴

* 참고로 stream_set_timeout()은 cli에서는 안먹힘, 이와 유사하게 set_time_out()또한 cli에서는 안먹힘

'PHP' 카테고리의 다른 글

cli에서 set_time_out() 테스트  (0) 2012.01.31
Posted by 광장군
,
http://www.dbguide.net/db.db?cmd=view&boardUid=146599&boardConfigUid=9&categoryUid=216&boardIdx=129&boardStep=1

http://eureka7.com.ne.kr/MySQL_4_1_API/memory-use.html

http://blog.naver.com/PostView.nhn?blogId=ez_&logNo=140127665878

http://cyller.tistory.com/5

http://www.ssovi.com/zb/view.php?id=pds&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&select_arrange=name&desc=desc&no=459

http://pneuma08.tistory.com/21

http://translate.google.co.kr/translate?hl=ko&sl=en&tl=ko&u=http%3A%2F%2Fwww.mysqlperformanceblog.com%2F2006%2F05%2F30%2Finnodb-memory-usage%2F&anno=2

http://dev.paran.com/2011/07/01/mysql-innodb-storage-engine-benchmark/

http://allkr.springnote.com/pages/4324675

http://phiz.kr/624

http://opencode.co.kr/bbs/board.php?bo_table=mysql_tips&wr_id=59

http://blog.naver.com/youlcc74?Redirect=Log&logNo=150126774869

'MySQL' 카테고리의 다른 글

우분투에서 MySQL 커파일시 ./configure 에러 관련  (0) 2012.02.03
Posted by 광장군
,