Wilson_Yang / sendtask
Requires
- catfan/medoo: ^1.5
This package is auto-updated.
Last update: 2024-09-24 22:05:33 UTC
README
由swoole实现的简单任务工具
客户端有两种实现方式:
- 使用swoole客户端实现
- 使用stream_socket_client实现
原理
通过Swoole的TCP服务器接收客户端发送的消息,消息都是经过序列化的,用PHP_EOL拼接,在服务器工作进程中再进行拆分。根据消息类型(目前只支持AbstractTask
类和Linux系统shell命令类)分别执行。数据库采用Mysql PDO实现,并配置了持久化。服务器中的数据库资源都是在运行时进行注入的,运行时可以复用一个数据库连接,减少了资源消耗。
用法
启动服务器
分别执行bin
目录下对应的shell脚本即可,
- 启动
./bin/start.sh
- 关闭
./bin/stop.sh
- 重启
./bin/restart.sh
- 热更新
./bin/reload.sh
配置文件
都放在config
文件夹中,客户端和服务端可以分别部署在不同机器上,只需将swoole.php
文件中的ip
字段按照网络情况相应改写即可。
添加任务
在其他地方使用时只需要类似如下方式
方法一:执行某个外部命令(推荐方式) 建议在各种MVC框架下使用命令行
形式去执行有关任务,可以避免再去重新学习适应当前这个框架中的逻辑。执行的外部命令需要进行审核,目前未进行权限和用户的相关处理(以免有些未经过审核的shell运行,危及系统安全,例如rm -rf /
),
使用方法
<?php $command = 'echo "hello world"'; (new TaskClient\SwooleSender())->sendCommand($command);
方法二:在 task
文件夹中继承 AbstractTask
抽象任务。按照例子中去实现
$lamb = new Lamb('Mary');
(new TaskClient\SwooleSender())->sendTask($lamb);
不同项目中,如果使用这种方式,需要注意在server项目中注册client的加载路径,否则会出现命名空间找不到的问题。如下介绍了不同框架中使用该方式的方法:
在CI框架中使用的方法
安装
composer require wilson_yang/sendtask
配置
- 在CI框架中开启composer支持自动加载;
- 在CI框架的
config
目录中添加swoole.php
注册文件,可直接拷贝当前框架中的样式,CI中只用到了客户端,所以我们只需要放置IP和端口字段就可以了. - 如果不使用上述方法二还需要: 在application目录下(或者别的目录下也行)建立一个任务文件夹,用来存放异步任务,这些任务类都要继承自
AbstractTask
抽象类。在本框架中的composer.json文件中的autoload
字段的"classmap"
中加入CI框架中刚新建的task
任务目录绝对路径,例如
"classmap":["/Users/yangzuwei/Desktop/php/api/application/task"],
然后执行在本框架根目录下执行 composer dump-autoload
,然后重启服务器执行./bin.reload
。 :sun: :dog
在Laravel框架下使用的方法
安装
composer require wilson_yang/sendtask dev-dev
发布
php artisan vendor:publish --provider="Wilson\Async\Provider\TaskServiceProvider"
启动服务器
php artisan swoole:task start|stop|reload|restart
。
编写任务
继承 Wilson\Async\Task\AbstractTask
抽象类即可,需要实现其中的 handle
方法。
在fpm中执行一些需要高权限的操作
因为一般的fpm安全限制,我们一般无法使用exec\shell_exec之类的PHP内置函数。如果我们使用异步客户端将命令发给以高权限运行的server去执行,那么就可以成功了。例如我们希望通过网页上的某个按钮去发起服务器上的某shell脚本执行部署操作。
待办事项
考虑异步任务失败情况,回收存储失败任务