XAMPP 環境の PHP で UDPソケット を受信する

経緯

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 Fatal error: Uncaught Error: Call to undefined function socket_create() の対処

PHP を CLI から実行

この記事を書いた人

アルム=バンド

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