[PHP] PHP实现tail命令并推送给websocket服务
原创
©著作权归作者所有:来自51CTO博客作者程序员老狼哦的原创作品,请联系作者获取转载授权,否则将追究法律责任
php守护进程,获取最新添加的文件内容,推送给服务
composer require textalk/websocket
<?php
require('vendor/autoload.php');
use WebSocket\Client;
if(3 > count($argv)){
fwrite(
STDERR,
'调用格式错误!使用格式 "tail.php 文件路径 服务地址 -d"'.PHP_EOL
);
return 1;
}
define("MAX_SHOW", 8192);
$file_name = $argv[1];
$server = $argv[2];
if(isset($argv[3])&&$argv[3]=='-d'){
umask(0);
if (pcntl_fork() != 0){
exit();
}
if (pcntl_fork() != 0){
exit();
}
chdir("/");
}
$file_size = 0;
$file_size_new = 0;
$add_size = 0;
$ignore_size = 0;
$sendData='';
$ss = exec('/sbin/ifconfig eth0 | sed -n \'s/^ *.*addr:\\([0-9.]\\{7,\\}\\) .*$/\\1/p\'',$arr);
$ip=$arr[0];
if(!file_exists($file_name)){
//echo "{$file_name} not exist".PHP_EOL;
return 1;
}
$fp = fopen($file_name, "r");
$client = new Client("ws://".$server);
while(1){
clearstatcache();
$file_size_new = filesize($file_name);
$add_size = $file_size_new - $file_size;
if($add_size > 0){
if($add_size > MAX_SHOW){
$ignore_size = $add_size - MAX_SHOW;
$add_size = MAX_SHOW;
fseek($fp,$ignore_size,$file_size);
}
$sendData.=fread($fp, $add_size);
while(!empty($sendData)){
try{
$lines=explode("\n",$sendData);
foreach($lines as $line){
if (!empty($line)) $client->send("[{$ip}] ".$line);
}
$res=$client->receive();
if(!empty($res)) $sendData='';
break;
}catch(Exception $e){
//echo "connect to {$server} failed".PHP_EOL;
$client = new Client("ws://".$server);
sleep(1);
}
}
$file_size = $file_size_new;
}
usleep(50000);
}
fclose($fp);
开源作品
GOFLY是一款基于Golang+Vue开发的在线客服系统,软件著作权编号:2021SR1462600。一套可私有化部署的在线客服系统,编译后的二进制文件可直接使用无需搭开发环境,下载zip解压即可,仅依赖MySQL数据库,是一个开箱即用的网页在线客服系统,致力于帮助广大开发者/中小站长快速整合私有客服功能。
github地址:go-fly
官网地址:https://gofly.sopans.com