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 광장군
,