これが、私が見つけたものです。
全般的
Venkatが書いたように、純粋なPHPで簡単なlistnerを書くことができます。約3〜5分後にタイムアウトすると失敗するため、ブラウザ経由ではなく、CLISAPIモードのPHPでSSH経由で実行するだけで済みます。
CLIモードで実行するには、PHPへのフルパスを知っている必要があり、適切なスイッチを使用して呼び出す必要があります。例えば:
/mnt/ext/opt/apache/bin/php -f /share/Web/projects/gps/gateway.php
PHP CLIはstdout
forを使用しecho
ません(何を使用するかはわかりません)。したがって、エコーをファイルまたはデータベースに値を格納することで置き換えて、リストナーが機能している実際の効果を確認します。
set_time_limit(0)
無限の中断のない実行のために関数を使用する必要があるかもしれません。ただし、報告されており(ここでユーザー提供のメモを参照)、CLI SAPIの場合は0にハードコードされているため、これを設定することは必須ではない場合があります。
スクリプトをCLIモードで実行した後、Ctrl+Cを使用してスクリプトを中断できます。
Listnerの例
これは、すべてをドロップするリストナーの例です。これは、スクリプトファイルが配置されている同じディレクトリの「drop.txt」ファイルに受信されます。
error_reporting(E_ALL | E_STRICT);
$file = './dump.txt';
$socket = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
socket_bind($socket, '0.0.0.0', 12345);
while(TRUE)
{
$buf = '';
$from = '';
$port = 0;
socket_recvfrom($socket, $buf, 1024, 0, $from, $port);
$momentum = time();
$entry = $momentum.' -- received "'.trim($buf).'" from '.$from.' on port '.$port.PHP_EOL;
file_put_contents($file, $entry, FILE_APPEND | LOCK_EX);
}
物事、あなたは心に留めておくべきです:
このスクリプトは無限ループを使用するため、実行後にスクリプトを中断する唯一の方法は、Ctrl+Cをキャストすることです。
すべてのソース(IPアドレス)からリッスンする場合はsocket_bindの0.0.0.0 IPアドレスを使用し、ローカルホストのみに制限する場合は127.0.0.1を使用します。
socket_recvfromの3番目のパラメーター(受信される最大バイト数)を慎重に選択して、待機しているデータが切り捨てられないようにします。
ファイルへのフルパスを使用する必要があります。使用しているのは、コードで$file = './dump.txt'
はなく、が存在する理由です。$file = 'dump.txt'
フルパスがないと、Webブラウザ経由でのみ機能します。
データベースの使用
受信したUDPパケットをデータベースにドロップすることにし、この目的でSQLiteを選択した場合は、データベースファイルへのフルパスだけでなく、絶対パスも指定する必要があります。それで:
$dbhandle = new SQLiteDatabase('/share/Web/projects/gps/data.db');
いいえ:
$dbhandle = new SQLiteDatabase('data.db');
あるいは:
$dbhandle = new SQLiteDatabase('./data.db');
2回目と3回目の試行は一部のシステムで失敗し(PHP構成によって異なります)、この場合、データベースファイルにそのようなテーブルがないという警告が表示されます。
ログオフの問題の修正
そのリスナーを実行するマシンに直接アクセスできず、SSH経由で接続している場合は、ログオフするとリスナーがオフになる可能性があることに注意してください。
この問題を修正するには、PHPスクリプトをデーモンモードで実行する必要があります(&
最後に追加することにより)。
/mnt/ext/opt/apache/bin/php -f /share/Web/gps/gateway.php&
またはscreen
、「wirtual」ターミナルで非デーモンバージョンのリスナーを実行するコマンドを使用します。