ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

про реализацию таймаута на php
  #1  
Старый 26.04.2007, 10:13
Аватар для null_access
null_access
Участник форума
Регистрация: 31.01.2005
Сообщений: 151
Провел на форуме:
422765

Репутация: 11
По умолчанию про реализацию таймаута на php

люди, есть скрипт,там цикл, в конце цикла скрипт вызывает функцию, та функция работает с сокетами и я вынес её в отдельный файл а в основном скрипте прописсал include(файл.php), нужно поставить таймаут как то на функцию целиком эту, и чтобы основной скрипт продолжал работать если функция прервалась по таймауту т.е. цикл продолжал бы выполняться, а если написсать set_time_limit(xx); в файле с функцией, то весь скрипт перестаёт работать, а нне только функция.

вопросик, как прерывать функцию по условию что время её работы истекло, и продолжать выполнение php?
 
Ответить с цитированием

  #2  
Старый 26.04.2007, 18:38
Аватар для SMiX
SMiX
Участник форума
Регистрация: 25.07.2005
Сообщений: 246
Провел на форуме:
457850

Репутация: 174
По умолчанию

1 вариант - pcntl_fork()
2 - напрямую через системные вызовы() [удобнее popen() proc_open()]
 
Ответить с цитированием

  #3  
Старый 27.04.2007, 14:45
Аватар для null_access
null_access
Участник форума
Регистрация: 31.01.2005
Сообщений: 151
Провел на форуме:
422765

Репутация: 11
По умолчанию

начал делать с помощью proc_open:
Код:
<?php
set_time_limit(0);
for($t=0;$t<100000;$t++) //цикл
{

$descriptorspec = array(
   0 => array("pipe", "r"),  // stdin это канал, из которого потомок будет читать
   1 => array("pipe", "w"),  // stdout это канал, в который потомок будет записывать
   2 => array("file", "/tmp/error-output.txt", "a"), // stderr это файл для записи
);
$process = proc_open("php", $descriptorspec, $pipes);

if (is_resource($process)) {

    // $pipes выглядит теперь примерно так:
    // 0 => записываемый дескриптор, соединённый с дочерним stdin
    // 1 => читаемый дескриптор, соединённый с дочерним stdout
    // Любой вывод ошибки будет присоединён к /tmp/error-output.txt

    fwrite($pipes[0], func_needed_timeout($zz));
    fclose($pipes[0]);

    while(!feof($pipes[1])) {
        echo fgets($pipes[1], 1024);
    }
    fclose($pipes[1]);
    // Важно, чтобы вы закрыли любые каналы до вызова
    // proc_close, чтобы исключить тупиковую блокировку
    $return_value = proc_close($process);

    echo "command returned $return_value\n";
}

}

function function_needed_timeout($zz)
{
set_time_limit(10);
//здесь дописать код ункции нуждающаяся в прерывании по таймауту
}
?>
Думал set_time_limit если установить на родительский и дочерний процессы как в примере, всё будет работать, а нет, всё равно прерывается работа всего скрипта.
Need help, как принудительно прерывать функцию под названием function_needed_timeout($zz) через заданный промежток времени?
 
Ответить с цитированием

  #4  
Старый 27.04.2007, 16:23
Аватар для SMiX
SMiX
Участник форума
Регистрация: 25.07.2005
Сообщений: 246
Провел на форуме:
457850

Репутация: 174
По умолчанию

В данном случае таймаут выставляй не с помощью set_time_limit(), а контроллируй время выполнения скрипта(`потока`) главным скриптом.
 
Ответить с цитированием

  #5  
Старый 27.04.2007, 18:50
Аватар для Isis
Isis
Флудер
Регистрация: 20.11.2006
Сообщений: 3,316
Провел на форуме:
16641028

Репутация: 2371


По умолчанию

sleep() ?
 
Ответить с цитированием

  #6  
Старый 27.04.2007, 19:16
Аватар для SMiX
SMiX
Участник форума
Регистрация: 25.07.2005
Сообщений: 246
Провел на форуме:
457850

Репутация: 174
По умолчанию

Причем здесь sleep()?
 
Ответить с цитированием

  #7  
Старый 27.04.2007, 20:32
Аватар для Developer
Developer
Участник форума
Регистрация: 03.05.2006
Сообщений: 167
Провел на форуме:
125505

Репутация: 116
По умолчанию

По сабжу:

Таймаут на функцию - значит таймаут на соединение сокета. Функция fsockopen принимает пятый параметр timeout, по истечении которого хост считается мертвым.

Таймаут на скрипт - это set_time_limit, определующий максимально допустимое время выполнения скрипта. Для неограниченного выполнения - set_time_limit(0). Функция не работает с Safe Mode.
Так же не забывает про то, что у Apache есть свой таймаут и подвисшие процессы он убивает самостоятельно. Так что если хотим работы скрипта "пока не исполнится" - запускаем его через exec/system/popen и т.п.
 
Ответить с цитированием

  #8  
Старый 27.04.2007, 22:05
Аватар для Developer
Developer
Участник форума
Регистрация: 03.05.2006
Сообщений: 167
Провел на форуме:
125505

Репутация: 116
По умолчанию

А вот так я запускаю скрипты в фоновом режиме:

PHP код:
if (file_exists('is_running.txt')) {
    
writeFile(time() . '>BStart' EOL'is_running.txt''a');
    ... 
Тут идем сам скрипт
    unlink
('is_running.txt');
    exit;
}

if (isset(
$_GET['start'])) {
    
writeFile(time() . '>SStart' EOL'is_running.txt''w');
    
$fp popen('php -f ' __FILE__ ' &''r');
    
pclose($fp);
    echo 
'Script started!';

Для тех, кому интерестно, что же все-таки за функция writeFile:

PHP код:
function writeFile($data$file$type 'a')
{
    
$fp fopen($file$type);
    
flock($fp2);
    
fwrite($fp$data);
    
flock($fp3);
    
fclose($fp);

 
Ответить с цитированием

  #9  
Старый 27.04.2007, 22:06
Аватар для Developer
Developer
Участник форума
Регистрация: 03.05.2006
Сообщений: 167
Провел на форуме:
125505

Репутация: 116
По умолчанию

EOL:

PHP код:
define('EOL'"\n"); 
ЗЫ: Жаль на форуме не дополняются сообщения, не привычно.
 
Ответить с цитированием

  #10  
Старый 28.04.2007, 00:31
Аватар для null_access
null_access
Участник форума
Регистрация: 31.01.2005
Сообщений: 151
Провел на форуме:
422765

Репутация: 11
По умолчанию

Цитата:
Сообщение от Developer  
По сабжу:

Таймаут на функцию - значит таймаут на соединение сокета. Функция fsockopen принимает пятый параметр timeout, по истечении которого хост считается мертвым.
Это по теории так, а на практике я имею такую ситуацию, что такой вот код являющийся частью функции:
PHP код:
$fp=fsockopen($HostName$HostPort$errno$errstr30); 

if (!
$fp//Если соединение прошло неуспешно, выводим сообщение об ошибке ставшей причиной проблемы.
    

    echo 
"$errstr ($errno)<br />\n"
    } 
else         
//Если соединение прошло успешно, то формируем пакет запрса к серверу. 
    

    
$out  "GET .......\r\n"
    ................

    
stream_set_timeout($fp30);     //Выставляем таймау на операции с сервером. Если в течение заданного отрезка времени не происходит никакого
                                //обмена данными, то считаем чо соединение подвисло и обрываем его. 

    
fputs($fp$out);         //Передаем ранее сформированный пакт данных серверу. 

   //получаем ответ сервера в переменную $Page 
        
$Page=""
        while (!
feof($fp)) 
            { 
            
$Page.=fgets($fp); 
            } 
так вот, такой вод код, очень часто подвисает на неограниченное время, и только поэтому я стартанул эту темку.)
пасибки большое, что пишите свои мысли по этому поводу, пока ещё не сделал что нужно, учусь типа.)
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Books PHP FRAGNATIC PHP, PERL, MySQL, JavaScript 186 21.02.2010 02:41
Books PSalm69 Избранное 248 27.10.2009 04:52
На PHP, как на "Новые ворота"... Mertvii-Listopad Чужие Статьи 7 18.09.2006 12:42
Безопасность в Php, Часть Iii k00p3r Чужие Статьи 0 11.07.2005 19:02
Защищаем Php. Шаг за шагом. k00p3r Чужие Статьи 0 13.06.2005 11:31



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ