サーバーがプロセスを再起動/停止/開始するたびに、PHP 24/7/365でスクリプト化されたPHP WebSocketをサービスとして自動的に実行する必要があります。プロセスは自動的に起動する必要があります
ブラウザからtest.phpにアクセスすると、つまりwww.example.com/libraries/server/test.php
が起動し、ポート8080で実行を継続するとします
ただし、以下のコマンドで強制終了してプロセスを終了しようとするとします
# kill $(lsof -t -i:8080)
# lsof -i:8080
自動的に起動する必要があります
1日ごとまたは特定の日にcronジョブを使用してスケジューラーとして実行する予定がある場合。サーバーのダウンタイムだけでなく、サーバーのアップタイムによる補償をどのように妥協しますか?または、1秒ごとにcronジョブを実行しようとした場合にオプションがどれも残っていない場合、WebSocketがポート8080で実行されているかどうかにかかわらず、コードをスクリプト化するにはどうすればShell_exec()
またはvia exec()
コマンド
これがtest.phpのコードです
<?php
# The maximum execution time, in seconds. If set to zero, no time limit is imposed.
set_time_limit(0);
# Make sure to keep alive the script when a client disconnect.
ignore_user_abort(true);
error_reporting(E_ALL);
ini_set('display_errors', 'On');
error_reporting(-1); // reports all errors
ini_set("display_errors", "1"); // shows all errors
ini_set("log_errors", 1);
ini_set("error_log", "/var/www/vhosts/somedomain.com/httpdocs/websocket.log");
echo "Script start at: " . date('h:i:s') . "\n";
exec('bash -c "exec Nohup php websocket_server.php >> /var/www/vhosts/somedomain.com/httpdocs/websocket.log 2>&1 &"');
Shell_exec('Nohup php /var/www/vhosts/somedomain.com/httpdocs/proj_ci/application/libraries/server/websocket_server.php 2>&1 >> /var/www/vhosts/somedomain.com/httpdocs/websocket.log &');
echo "Script end at: " . date('h:i:s');
?>
HTTPサーバーの起動時に自動化されたサービスとしてプロセスを実行するにはどうすればよいですか?
バックグラウンドで起動して実行し続けるsupervisor
またはsystemd
の助けを借りて。 SSH経由で実行する必要があるLinuxコマンドは何ですか?
systemd
を使用してPHPをデーモン/サービスとして実行するphp_socketme.sh
#!/bin/bash
Nohup /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/test.php >> /var/www/vhosts/somedomain.com/httpdocs/php_socketme.log 2>&1
php_socketme.service
[Unit]
Description=RunningPHPWebSockets(socketme.io)
[Service]
User=root
ExecStart=/var/www/vhosts/somedomain.com/httpdocs/libraries/server/php_socketme.sh
[Install]
WantedBy=multi-user.target
ターミナルから
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# ./php_socketme.sh
-bash: ./php_socketme.sh: Permission denied
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod a+x socketme.sh
chmod: cannot access 'socketme.sh': No such file or directory
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod a+x php_socketme.sh
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# ./php_socketme.sh
-bash: ./php_socketme.sh: /bin/bash^M: bad interpreter: No such file or directory
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# dos2unix php_socketme.sh
dos2unix: Datei php_socketme.sh wird ins Unix-Format umgewandelt ...
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# chmod 755 test.php
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# cp php_socketme.service /etc/systemd/system/php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl daemon-reload
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl start php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl status php_socketme.service
● php_socketme.service - RunningPHPWebSockets(socketme.io)
Loaded: loaded (/etc/systemd/system/php_socketme.service; disabled; vendor preset: enabled)
Active: active (running) since Fr 2018-11-16 16:06:18 IST; 4min 9s ago
Main PID: 29799 (myphp.sh)
CGroup: /system.slice/php_socketme.service
├─29799 /bin/bash /var/www/vhosts/somedomain.com/httpdocs/libraries/server/myphp.sh
└─29800 /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/myservice.php
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl stop php_socketme.service
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl status php_socketme.service
● php_socketme.service - RunningPHPWebSockets(socketme.io)
Loaded: loaded (/etc/systemd/system/php_socketme.service; disabled; vendor preset: enabled)
Active: inactive (dead)
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl enable php_socketme.service
Created symlink from /etc/systemd/system/multi-user.target.wants/php_socketme.service to /etc/systemd/system/php_socketme.service.
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server# systemctl is-enabled php_socketme.service
enabled
root@user:/var/www/vhosts/somedomain.com/httpdocs/libraries/server#
webs.sh
#!/bin/bash
### BEGIN INIT INFO
# Provides: webSocket
# Required-Start: $local_fs $network
# Required-Stop: $local_fs
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: php webSocket
# Description: php webSocket
### END INIT INFO
Nohup /usr/bin/php /var/www/vhosts/somedomain.com/httpdocs/libraries/server/websocket_server.php >> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/webssh.log 2>&1
websocket.service
[Unit]
Description=php webSocket
After=syslog.target network.target
[Service]
User=root
Type=simple
ExecStart=/var/www/vhosts/somedomain.com/httpdocs/libraries/server/webs.sh >> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/AllStandardOutput.log>> /var/www/vhosts/somedomain.com/httpdocs/custom_logs/AllStandardError.log
TimeoutStopSec=20
KillMode=process
Restart=always
RestartSec=2
StandardOutput=file:/var/www/vhosts/somedomain.com/httpdocs/custom_logs/StandardOutput.log
StandardError=file:/var/www/vhosts/somedomain.com/httpdocs/custom_logs/StandardError.log
[Install]
WantedBy=multi-user.target
Alias=websocket.service
コマンドは次のとおりです
cp websocket.service /etc/systemd/system/websocket.service
systemctl daemon-reload
systemctl start websocket.service
systemctl status websocket.service
systemctl stop websocket.service
systemctl restart websocket.service
systemctl enable websocket.service
systemctl is-enabled websocket.service
systemctl disable websocket.service
lsof -i:8080
ExecStart=/bin/sh -c '/usr/local/bin/binary1 agent -config-dir /etc/sample.d/server 2>&1 > /var/log.log'
ExecStart=/usr/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'
サービスの再起動間でファイルログを保持し、新しいログ行を追加するだけの場合は、代わりに次を使用します。
ExecStart=/usr/bin/sh -c 'exec /usr/bin/my_binary [arguments] >>/var/log/flume-ng/log1.log 2>>/var/log/flume-ng/log2.log'
execは、フォークせずにリダイレクトを設定した後、シェルプログラムがmy_binaryプログラムに置き換えられることを意味します。したがって、ExecStart=
の直後にmy_binaryを実行するのと何の違いもありません。
ファイアウォールで
着信トラフィックのシステムポリシー他のすべての着信トラフィックを許可する
OR
カスタムルールを作成します。
WebSocketsはポート8080/tcp、8080/udpのすべてからの着信を許可します