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 에 대한 적절한 지연을 허위로 반환하고 빈번한 오류를 위해 로그를 모니터링하는 것이 좋습니다.
M66.net 과 같은 도메인 이름을 통해 외부 세계에 서비스를 제공하려면 NGINX 또는 기타 리버스 프록시 소프트웨어와 함께 해당 서비스에 포트를 매핑 할 수 있습니다. 예를 들어: