Может ли другой родитель закрыть постоянные асинхронные соединения - PullRequest
0 голосов
/ 24 марта 2012

Я сделал файл cron, который вызывает различные задания асинхронно и заканчивается вызовом спящего асинхронно. Спящий спит в течение 1 минуты, а затем вызывает сценарии cron асинхронно и т. Д.

Но я хочу перестроить систему, чтобы сохранить последний «указатель файла» в файле и использовать его позже, чтобы остановить процесс. Это то, что можно сделать?

Пример кода:

sleeper.php

sleep(60);
call($_SERVER['HTTP_HOST'], dirname($_SERVER['REQUEST_URI']).'/cron.php', ( DEBUG ? 'write_log' : '' ) );

cron.php

foreach ($jobs as $job)
{
    $job = parse_url($job);
    call(dispatch_generic_job($job['port'], $job['path'], $job['port'], ( LOG_JOBS ? 'write_job' : '' ) );
}

call($_SERVER['HTTP_HOST'], dirname($_SERVER['REQUEST_URI']).'/sleeper.php', ( DEBUG ? 'write_log' : '' ) );

object.php:

function call($server, $url, $port = 80, $log)
{
    @set_time_limit(0);

    $timeout = 10;
    $rw_timeout = 86400;
    $error_number = '';
    $error_string = '';

    $con = @fsockopen($server, $port, $error_number, $error_string, $timeout);
    if (!$con)
    {
       $log($error_string.' ('.$error_number.') Ref: '.$server.':'.$port.$url);
       return false;
    }
    $qry = 'GET '.$url.' HTTP/1.1'."\r\n";
    $qry .= 'Host: '.$server."\r\n";
    $qry .= 'User-Agent: test'."\r\n";
    $qry .= 'Connection: Close'."\r\n\r\n";

    stream_set_blocking($con, false);
    stream_set_timeout($con, $rw_timeout);
    fwrite($con, $qry);

    if ( $log )
    {
        while ( !feof($con) )
        {
            $line = fgets($con, 128);
            if ( !empty($line) )
            {
                $log('Status: '.rtrim($line).' Ref: '.$server.':'.$port.$url);
                break;
            }
        }
    }

    return True;
}

* UPDATE *** Обычно вы закрываете постоянные соединения, когда вы закончите с его использованием. Но потому что я использую асинхронные (stream_set_blocking) постоянные соединения (fsockopen) без закрытия, чтобы скрипт мог продолжать цикл каждую минуту без родителя. (Cron.php вызывает Slepper.php, вызывает Cron.php и т. Д.)

Я хочу перестроить свои сценарии, чтобы сохранить последний «указатель файла», чтобы я мог использовать его позже для закрытия постоянных соединений.

Я много читал, но не нашел пути. PHP: socket_import_stream - Manual

Пример:

object.php

function call($server, $url, $port = 80, $log)
{
    ......

    $con = @fsockopen($server, $port, $error_number, $error_string, $timeout);
    if (!$con)
    {
       $log($error_string.' ('.$error_number.') Ref: '.$server.':'.$port.$url);
       return false;
    }

    file_put_contents(__DIR__.'/steam', $con); // Obviously can not be performed

    ......
}

stop.php

$lats_con = file_get_contents(__DIR__.'/steam');
fclose($lats_con);
echo 'Cron is stopped';

PHP: список типов ресурсов - Руководство

PHP: постоянные соединения с базой данных - руководство

...