Wilson_Yang/sendtask

此软件包的最新版本(v1.0.0)没有可用的许可证信息。

v1.0.0 2018-12-03 09:14 UTC

This package is auto-updated.

Last update: 2024-09-24 22:05:33 UTC


README

由swoole实现的简单任务工具

客户端有两种实现方式:

  1. 使用swoole客户端实现
  2. 使用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脚本执行部署操作。

待办事项

考虑异步任务失败情况,回收存储失败任务