経緯
PHP で Syslog のパケットを受信する簡易的な Syslogサーバ がでいないか、と思い立って検証してみることにしました。
Syslog なので UDP/514 で待ち受ける形になりますが、サクッと試したかったので XAMPP 環境で動かしてみようと思いました。
現象
今回用意したのは以下のようなコード。
PHPコード
<?php
$port = 514;
$file = "./tmp.txt";
//UDPのソケット作成
$sock = socket_create(AF_INET,SOCK_DGRAM,SOL_UDP);
socket_bind($sock,'192.2.0.1',$port);
$from = '';
while(true) {
// UDPのソケットを受信
socket_recvfrom($sock,$buf,4096,0,$from,$port);
var_dump($buf);
file_put_contents($file, $buf . "\n", FILE_APPEND | LOCK_EX);
}
socket_close($sock);
socket_close($socket);
これを XMAPP 環境でコマンドラインから実行したところ、以下のような Fatal エラーが発生してしまいました。
> php -f .\hokurakushimon.php
PHP Fatal error: Uncaught Error: Call to undefined function socket_create() in PATH\TO\PROJECT\hokurakushimon.php:12
Stack trace:
#0 {main}
thrown in PATH\TO\PROJECT\hokurakushimon.php on line 12
Fatal error: Uncaught Error: Call to undefined function socket_create() in PATH\TO\PROJECT\hokurakushimon.php on line 12
Error: Call to undefined function socket_create() in PATH\TO\PROJECT\hokurakushimon.php on line 12
PHP Fatal error: Uncaught Error: Call to undefined function socket_create()
ですって……?
対処
調べてみたところ、 XAMPP 環境ではデフォルトではソケットに関するライブラリ(DLL)が読み込まれていないようです。
そのため、 php.ini
を書き換えて読み込むように設定を変更 (Apache 自体も再起動) すれば良いとのこと。
;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;
;; 略
;extension=soap
;; コメントアウトを解除
extension=sockets
extension=sodium
;extension=sqlite3
;extension=tidy
;extension=xmlrpc
;extension=xsl
これでエラーが発生しなくなったことを確認できました。
参考
PHP で UDPソケット 受信
- PHPでソケット通信(UDP) – きょろきょろ(๑´• ₃ •̀๑)
- PHPでソケットを使った単一のソケットサーバー VS 複数のソケットクライアントの双方向チャット。 #PHP7 – Qiita
- PHPで、ソケット通信(UDP)をする。その2(複数のPCからAQUOSを制御する。) – coLinux日記
- インターネットドメインまたは Unix ドメインのサーバーソケットを作成する