1

運用サーバーにログインしてファイルを取得し、このファイルのデータでデータベースを更新する必要があります。これは運用データベースであるため、ファイルが巨大でサーバーに影響を与える可能性があるため、5 分ごとにファイル全体を取得したくありません。このファイルの最後の 30 行を 5 分ごとに取得し、できるだけ影響を与えないようにする必要があります。

以下は私の現在のコードです。これをどのように達成するのが最善かについての洞察をいただければ幸いです。

<?php

$user="id";
$pass="passed";
$c = curl_init("sftp://$user:$pass@server1.example.net/opt/vmstat_server1");
curl_setopt($c, CURLOPT_PROTOCOLS, CURLPROTO_SFTP);
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($c);
curl_close($c);
$data = explode("\n", $data);
?>
4

3 に答える 3

7

マーク B は間違っています。SFTP は、部分的なファイル転送に完全に対応しています。以下は、純粋な PHP SFTP 実装である phpseclib で必要なことを行う方法の例です。

<?php
include('Net/SFTP.php');

$sftp = new Net_SFTP('www.domain.tld');
if (!$sftp->login('username', 'password')) {
    exit('Login Failed');
}

$size = $sftp->size('filename.remote');

// outputs the last ten bytes of filename.remote
echo $sftp->get('filename.remote', false, $size - 10);
?>

実際、一部の SFTP サーバーではシステム シェル経由でコマンドを実行できないため、とにかくこのようなアプローチをお勧めします。さらに、SFTP は Windows SFTP サーバーで動作しますが、シェル アクセスがあったとしても、tail は動作しそうにありません。すなわち。全体として、ソリューションの移植性がはるかに高くなります。

ファイルの最後の x 行を取得したい場合は、10x の改行文字に遭遇するまで、毎回何バイトも読み取って繰り返しループすることができます。すなわち。最後の 10 バイトを取得し、次に最後の 10 バイトの次のバイトを取得し、次にそれらの 10 バイトの前の 10 バイトなどを取得します。

于 2013-06-25T14:53:58.690 に答える