さまざまなジョブを非同期で呼び出し、最終的にスリーパーを非同期で呼び出す 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 - マニュアル
例:
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';