https://github.com/anhoder/php-async
PHP异步回调的简单实现
https://github.com/anhoder/php-async
async php php-async php-fpm
Last synced: 2 months ago
JSON representation
PHP异步回调的简单实现
- Host: GitHub
- URL: https://github.com/anhoder/php-async
- Owner: anhoder
- Created: 2019-08-04T07:48:52.000Z (almost 6 years ago)
- Default Branch: master
- Last Pushed: 2019-08-19T01:25:39.000Z (almost 6 years ago)
- Last Synced: 2025-01-27T06:15:11.274Z (4 months ago)
- Topics: async, php, php-async, php-fpm
- Language: PHP
- Size: 1.69 MB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# php-async
PHP异步回调的简单实现
**php-fpm模式的使用,仍在测试,可能会出现未知问题。**
* php-fpm模式下已解决的问题:
> 解决异步进程执行完成后,成为僵尸进程的问题
>
> 经测试,异步进程的fork不受php-fpm配置的进程数限制## Requirement / 依赖
* ext-pcntl
* php > 5.6## Installation / 安装
```sh
composer require alanalbert/php-async
```## Usage / 使用
> 该库可以工作在php-fpm或cli模式下。(但是,每个异步任务会创建一个进程进行处理,直至任务完成后才会被**彻底杀死**)
**现在可以使用[PHP Async Manager](https://github.com/AlanAlbert/php-async-manager)命令行工具进行异步任务管理。**
### 使用实例
```php
require './vendor/autoload.php';use Async\DaemonProcess;
use Async\Job;// 异步操作任务
$job = new Job();
// 设置异步任务
$job->setJob(function () {
sleep(5);
});
// 设置回调函数
$job->setCallback(function () {
file_put_contents('处理完成.txt', '处理完成');
});// 实例化异步进程
$daemon = new DaemonProcess($job);
$daemon->run();
```### Async\DaemonProcess
守护进程类,该类提供的方法有:
```php
// 构造函数,接收实现Async\Contract\JobInterface接口的类的实例
__construct(Async\Contract\JobInterface $job): void// 运行守护进程
run(): void
```### Async\Contract\JobInterface
异步任务接口,该接口很简单,只需要实现两个方法即可:
```php
// 异步任务
job(): void
// 回调任务
callback(): void
```### Async\Job
该类实现了`Async\Contract\JobInterface`接口,使用起来更方便,其提供的方法有:
```php
// 设置异步任务
// $job可以为callable或Closure类型
// $params为异步任务需要使用的参数,会在执行时,传入给异步任务
setJob($job, $params = null): void// 设置回调函数
// $callback可以为callable或Closure类型
// $params为回调函数需要使用的参数,会在执行时,传入给回调函数
setCallback($callback, $params = null): void
```### 其他
* 在使用该库执行异步任务时,会生成日志文件,位于`/tmp/php-async-log/`下
* 如果不使用`Async\Job`类,也可以自定义类并实现`Async\Contract\JobInterface`接口## TODO
* ...