PHP のソケット通信で Syslog メッセージを送信する

経緯

以前 PHP で Syslog を受信するサーバ側の実装は行いましたが、今回は PHP で Syslog を送信するクライアント側の実装です。

コード

早速ですがコードを。

<?php

// UDPのソケット作成
$sock = socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);
// メッセージ作成
// Priority: local use 0 (local0) (16) * 8 + 4 (Warning)
$priority = (16 * 8) + 4;
// 日時
$now_unix = time();
$month_str = date('M', $now_unix);
$date_str = str_pad(date('j', $now_unix), 2, " ", STR_PAD_LEFT);
$time_str = date('H:i:s', $now_unix);
$now_str = $month_str . ' ' . $date_str . ' ' . $time_str;
// ホスト名
$hostname = 'koishi.komeiji';
// メッセージ
$msg = 'もしもし?わたしメリーさん。今あなたの後ろにいるの。';
// 組み立て
$syslogMsg = '<' . $priority . '>' . $now_str . ' ' . $hostname . ' ' . $msg;
// UDPソケット通信: 送信
socket_sendto($sock, $syslogMsg, strlen($syslogMsg), 0, '192.0.2.1', 514);
socket_close($sock);

ざっくりこのような形に。嵌まりポイントとしては socket_sendto() 関数はメッセージの長さも指定が必要なのですが、 mb_strlen() を使うとマルチバイト文字が1カウントしかされないので UDP のバッファサイズとして不足してしまう (途中で文字列が切れてしまう) ということで、いくら検証しても途中でメッセージが途切れてしまいました。

気付けばなんてことはないのですが、 strlen() を使うことで克服。

それ以外はあまり変なところはなく素直な感じでした。

参考

ソケット送信

Syslog 周り

PHP の諸々

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。