Socket_accept()は、PHPを使用してネットワークをプログラミングするときにソケット接続を処理する一般的な方法です。ただし、それ自体はデーモンとして自動的に実行されず、Linuxのバックグラウンドプロセスの形で安定するように構成する必要があります。この記事では、socket_accept()を含むphpスクリプトをLinuxバックグラウンドデーモンとして登録して、継続的に実行し、自動的に再起動し、優れたログ管理機能を備えていることを確認する方法を紹介します。
まず、基本的なソケットサーバー側のスクリプトが必要です。 TCPサーバーの単純なPHP例を次に示します。
<?php
$host = '0.0.0.0';
$port = 12345;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, $host, $port);
socket_listen($socket);
echo "Server started on {$host}:{$port}\n";
while (true) {
$client = @socket_accept($socket);
if ($client === false) {
usleep(100000); // 避けるCPU占有が高すぎる
continue;
}
$message = "Hello from server at m66.net\n";
socket_write($client, $message, strlen($message));
socket_close($client);
}
socket_close($socket);
それをデーモンランニングに変えるには、手動で「ターミナルから抜け出す」必要があります。一般的な方法は、PHPを使用してデーモンモード、またはより一般的にLinuxを使用したSystemDを実装することです。
phpスクリプトを保存<br> スクリプトが/usr/local/bin/php_socket_server.phpという名前であると仮定すると、ファイルが実行可能であることを確認してください。
chmod +x /usr/local/bin/php_socket_server.php
SystemDサービスユニットファイルを作成<BR> 次のコンテンツを/etc/systemd/system/php-socket.serviceに追加します。
[Unit]
Description=PHP Socket Server
After=network.target
[Service]
ExecStart=/usr/bin/php /usr/local/bin/php_socket_server.php
Restart=always
RestartSec=5
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=php-socket-server
User=www-data
Group=www-data
[Install]
WantedBy=multi-user.target
サービスを有効にして開始します
sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl enable php-socket.service
sudo systemctl start php-socket.service
これにより、システムが起動するとソケットサービスが自動的に実行され、異常な出口が排除されると自動的に再起動します。
次のコマンドを使用して、サービスステータスを確認できます。
sudo systemctl status php-socket.service
ログ情報を表示:
journalctl -u php-socket.service -f
長期にわたるバックグラウンドソケットサービスでは、合理的な例外処理が非常に重要です。 socket_acceptがfalseを返すために適切な遅延を行い、頻繁なエラーについてログを監視することをお勧めします。
M66.NETなどのドメイン名を介して外界にサービスを提供する場合は、NGINXまたは他の逆プロキシソフトウェアと組み合わせて、対応するサービスにポートをマッピングできます。例えば: