2020 年了,现在最简单的 PHP 执行异步任务的方式是什么,不要框架,尽量十几二十行 PHP 代码能搞定?

2020-06-12 15:50:05 +08:00
 frozenway

想在这台服务器(国内)php 保存某些数据后,去更新另外一台服务器(国外)的文件缓存,如果是同步更新,保存数据的响应结果会太慢太卡,想着异步去做。要求尽量简单,不想左一个框架右一个框架,不用 redis,memkache 等,因为开启这些扩展需要编译 php,麻烦

7370 次点击
所在节点    PHP
44 条回复
luyaolu
2020-06-12 15:51:44 +08:00
接口请求另一个接口 我想到最简单的
CODEWEA
2020-06-12 15:53:32 +08:00
搜索关键词:linux 进程通信
yakumo520
2020-06-12 15:56:46 +08:00
那你干脆不用 php 吧,直接 linux 协程
qiayue
2020-06-12 16:05:36 +08:00
每一步一个 php 文件,假设 3 步,那就 3 个文件
step1.php 执行完之后,跳转到 step2.php ,执行完之后再跳转到 step3.php ,执行完之后跳回 step1.php
每次 step1.php 来判断是否有新的任务需要执行。
注意跳转不要用 header location 形式,而是用 html meta refresh 形式,延迟 1 秒跳转

然后你就开浏览器让他不断自动执行就行。
frozenway
2020-06-12 16:08:42 +08:00
@qiayue 这个方法不错
richangfan
2020-06-12 16:12:05 +08:00
加个定时任务
TORYOI
2020-06-12 16:22:48 +08:00
@qiayue 我以前用过这种方式,只是感觉好别扭
mokeyjay
2020-06-12 16:31:13 +08:00
crontab -e
php job.php
keepeye
2020-06-12 16:32:00 +08:00
单独写个服务,提供一个任务接口,调用接口的时候 fork 子进程处理,直接返回不用等待处理结果
whahuzhihao
2020-06-12 16:32:01 +08:00
用 popen 另外起一个 php 进程去执行异步任务呗
ben1024
2020-06-12 16:48:56 +08:00
要是数据库可以用 canal
纯文件挂文件流传输,一个点开,一个点请求
yuzo555
2020-06-12 16:56:21 +08:00
如果只是这个简单的需求,那么 PHP 是可以先响应然后继续执行的呀。

https://stackoverflow.com/questions/15273570/continue-processing-php-after-sending-http-response
Ech0o0
2020-06-12 17:23:57 +08:00
```php
<?php

set_time_limit(30);
ignore_user_abort(false);

header("Content-Length: 0");
header("Connection: Close");
echo str_pad('', ini_get('output_buffering'));
ob_end_flush();
ob_flush();
flush();

//耗时任务
sleep(10);
file_put_contents('test.log', date('Y-m-d H:i:s'), FILE_APPEND);
```

```php
<?php

$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://127.0.0.1/async.php');
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_exec($curl);
curl_close($curl);

echo '结束了';
```

有局限性,最好还是用队列吧
explore365
2020-06-12 17:30:56 +08:00
还是用一下框架吧,workerman,比较简单一些
frozenway
2020-06-12 17:33:49 +08:00
@yuzo555 这个长见识了
luckyrayyy
2020-06-12 17:37:12 +08:00
crontab 系统自带啊
I2E
2020-06-12 17:40:59 +08:00
尝试过,没搞出来,应该没法光靠 php 。说 sleep 的是认真的吗?
I2E
2020-06-12 17:43:29 +08:00
php 只能启多个进程去搞
I2E
2020-06-12 17:46:36 +08:00
我们现在通过这种方式实现异步任务。通过 pm2 启动一个 rabbitmq 死信队列,设置到期时间。一旦到期就会执行指定任务
AngryPanda
2020-06-12 17:54:48 +08:00
@I2E fastcgi_finish_request

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/681005

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX