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​