register_shutdown_function() не работает вместе с fsockopen()

MVH

Новичок
register_shutdown_function() не работает вместе с fsockopen()

Какой-то непонятный глюк при работе register_shutdown_function() и fsockopen()
При выполнении следующего кода выдаётся ошибка (иногда через раз):
PHP:
<?php
set_time_limit(5);
function Shutdown()
  {
  touch('c:\\qwe.txt');
  }
register_shutdown_function('Shutdown');
while (true)
  {
  fsockopen('dawjadlhi.ru', 80, $e, $en, 5);
  }
?>
Warning: fsockopen(): php_network_getaddresses: gethostbyname failed in h:\home\url_checker\www\1.php on line 10

Warning: fsockopen(): unable to connect to dawjadlhi.ru:80 in h:\home\url_checker\www\1.php on line 10

Warning: fsockopen(): php_network_getaddresses: gethostbyname failed in h:\home\url_checker\www\1.php on line 10

Warning: fsockopen(): unable to connect to dawjadlhi.ru:80 in h:\home\url_checker\www\1.php on line 10

Warning: fsockopen(): php_network_getaddresses: gethostbyname failed in h:\home\url_checker\www\1.php on line 10

Warning: fsockopen(): unable to connect to dawjadlhi.ru:80 in h:\home\url_checker\www\1.php on line 10

Fatal error: Maximum execution time of 5 seconds exceeded in h:\home\url_checker\www\1.php on line 10

Fatal error: Maximum execution time of 5 seconds exceeded in h:\home\url_checker\www\1.php on line 3
Shutdown функция соответственно не выполняется. Такое ощущение, что выполнение fsockopen() забирает время выполнения у shutdown ф-и, хотя как я проверял, для shutdown ф-и отводится своё время работы, после выполнения скрипта. В чём может быть дело???
Тестил на первом apache, PHP 4.3.6 под XP.
 

neko

tеam neko
я думаю, что вызов любых пользовательских функции
на 100% противоречит логике таймлимита
т.е. если время вышло, то оно вышло
 

MVH

Новичок
Это не так. register_shutdown_function() вызовется в любом случае. Это и на php.net написано.
Я даже проэкспериментировал на предмет того, сколько времени отводится на выполнение функции, зарегистрированной через register_shutdown_function().
Результат: время работы функции, зарегистрированной через register_shutdown_function(), не может превышать max_execution_time, установленный в php.ini (или ещё где). Т.е. выполняется скрипт, завершилось время выполнения (30 сек., например), запускается shutdown функция - и она может выполняться максимум 30 сек.
Если, кому интересно, то тестил так:
Выполнил этот скрипт:
PHP:
<?php
set_time_limit(1);
function Shutdown()
  {
  $i = 0;
  while ($i < 1)
    {
    $i++;
    }
  }
register_shutdown_function('Shutdown');
while (true)
  {
  }
?>
Выдалось сообщение:
Fatal error: Maximum execution time of 1 second exceeded in h:\home\url_checker\www\1.php on line 12
затем выполнил этот скрипт:
PHP:
<?php
set_time_limit(1);
function Shutdown()
  {
  $i = 0;
  while ($i < 100000000000000000000000000000)
    {
    $i++;
    }
  }
register_shutdown_function('Shutdown');
while (true)
  {
  }
?>
Выдалось 2 сообщения:
Fatal error: Maximum execution time of 1 second exceeded in h:\home\url_checker\www\1.php on line 14

Fatal error: Maximum execution time of 1 second exceeded in h:\home\url_checker\www\1.php on line 6
И из второго сообщения видно, что выполнение цикла while в ф-и Shutdown() превысило время выполнения скрипта.
 

neko

tеam neko
прикольно, не знал
вообще похоже на баг

-~{}~ 02.03.05 18:17:

попробовал первый пример
у меня тач работает

-~{}~ 02.03.05 18:23:

и соотв. я вижу одно сообщение о превышении таймлимита.
второй пример отрабатывает аналогично тому, что ты привел
 

MVH

Новичок
neko
попробовал первый пример
у меня тач работает
Этот:

<?php
set_time_limit(5);
function Shutdown()
{
touch('c:\\qwe.txt');
}
register_shutdown_function('Shutdown');
while (true)
{
fsockopen('dawjadlhi.ru', 80, $e, $en, 5);
}
?>
???
Если да, то попробуй несколько раз скрипт запустить. У меня так тоже бывает раз запустишь всё нормально, а другой раз ошибка.
 

neko

tеam neko
да попробовал уже, все ок

если то, что ты пишешь, по поводу того что шатдаун функции дается еще раз time_limit время на работу -- верно, то...
то почему собственно она за это время не успеет сделать тач?

за 5 секунд прекрасно должна успеть

-~{}~ 02.03.05 18:35:

пальцем в небо
я могу предположить, что это просто глюки платформы
и вообще таймлимит не распространяется на системные вызовы...
т.е. ни на lookup этого адреса
ни на создание файла...
 

MVH

Новичок
neko

то почему собственно она за это время не успеет сделать тач?
Там ошибка на 3-её линии возникает - так что сама ф-я по ходу не успевает вызваться...
да попробовал уже, все ок
А на какой ОС и на каком php ты всё это тестил?
 

MVH

Новичок
neko
Может это в PHP 4.3.6 баг? Пойду щас 5-ый php поставлю и на нём протестю.

-~{}~ 02.03.05 20:00:

Постивал php5 (под XP), но баг остался... Потом попробовал этот скрипт на FreeBSD (на php4) и о чудо - всё прекравно работает.
Всё дело было в видне - это она глючиная.
 
Сверху