跳至主要內容
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?

4563博客

全新的繁體中文 WordPress 網站
  • 首頁
  • 2020 年了,现在最简单的 PHP 执行异步任务的方式是什么,不要框架,尽量十几二十行 PHP 代码能搞定?
未分類
29 5 月 2020

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

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

資深大佬 : frozenway 6

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

大佬有話說 (43)

  • 資深大佬 : luyaolu

    接口请求另一个接口 我想到最简单的

  • 資深大佬 : CODEWEA

    搜索关键词:linux 进程通信

  • 資深大佬 : yakumo520

    那你干脆不用 php 吧,直接 linux 协程

  • 資深大佬 : qiayue

    每一步一个 php 文件,假设 3 步,那就 3 个文件
    step1.php 执行完之后,跳转到 step2.php ,执行完之后再跳转到 step3.php ,执行完之后跳回 step1.php
    每次 step1.php 来判断是否有新的任务需要执行。
    注意跳转不要用 header location 形式,而是用 html meta refresh 形式,延迟 1 秒跳转

    然后你就开浏览器让他不断自动执行就行。

  • 主 資深大佬 : frozenway

    @qiayue 这个方法不错

  • 資深大佬 : richangfan

    加个定时任务

  • 資深大佬 : TORYOI

    @qiayue 我以前用过这种方式,只是感觉好别扭

  • 資深大佬 : mokeyjay

    crontab -e
    php job.php

  • 資深大佬 : keepeye

    单独写个服务,提供一个任务接口,调用接口的时候 fork 子进程处理,直接返回不用等待处理结果

  • 資深大佬 : whahuzhihao

    用 popen 另外起一个 php 进程去执行异步任务呗

  • 資深大佬 : ben1024

    要是数据库可以用 canal
    纯文件挂文件流传输,一个点开,一个点请求

  • 資深大佬 : yuzo555

    如果只是这个简单的需求,那么 PHP 是可以先响应然后继续执行的呀。

    https://stackoverflow.com/questions/15273570/continue-processing-php-after-sending-http-response

  • 資深大佬 : Ech0o0

    “`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

    还是用一下框架吧,workerman,比较简单一些

  • 主 資深大佬 : frozenway

    @yuzo555 这个长见识了

  • 資深大佬 : luckyrayyy

    crontab 系统自带啊

  • 資深大佬 : I2E

    尝试过,没搞出来,应该没法光靠 php 。说 sleep 的是认真的吗?

  • 資深大佬 : I2E

    php 只能启多个进程去搞

  • 資深大佬 : I2E

    我们现在通过这种方式实现异步任务。通过 pm2 启动一个 rabbitmq 死信队列,设置到期时间。一旦到期就会执行指定任务

  • 資深大佬 : AngryPanda

    @I2E fastcgi_finish_request

  • 資深大佬 : caola

    swoole,编译只是一条命令而已

  • 資深大佬 : falcon05

    beanstalkd 简单粗暴

  • 資深大佬 : Tokin

    记得当时弄的一个简单的队列,后来改用 node 了。

  • 資深大佬 : dadmin

    国外服务器更新缓存功能写成接口 (需要设置 set_time_out(0); ignore_user_abort(true);)
    国内服务器通过 curl 请求国外更新缓存接口 并设置执行超时时间

  • 資深大佬 : xing393939

    https://www.laruence.com/2008/04/16/98.html

  • 資深大佬 : kaneg

    crontab 就是干这个活的

  • 資深大佬 : LevineChen

    fastcgi_finish_request 正解啊 应该是最简单方式了一行代码搞定.

  • 資深大佬 : edk24

    RabbitMQ, 最近刚用上这个队列功能处理视频转码.
    http://aili.edk24.com/1754293

    也许可以试一下, 消费者和生产者连接同一个服务, 生产者投递任务即时响应返回, 消费者在另一个服务器收到任务对它进行处理

    同步文件可以用 scp 之类的命令. 个人不精的建议. 也就 docker 运行个 Rabbitmq, 其他还真是几行代码

  • 資深大佬 : edk24

    或者 swoole 有异步任务

  • 資深大佬 : PHPJit

    fastcgi_finish_request

  • 資深大佬 : raysonlu

    “开启这些扩展需要编译 php,麻烦” 。。。???

  • 資深大佬 : yincrow

    swoole 的 worker 可以满足

  • 資深大佬 : jay4497

    曾经用 curl 做过类似的,就是发 curl 请求,设置不需要返回结果,然后再设个一秒的超时时间,效果就是程序到这会停一秒,然后就继续执行了,不会等待那边处理完成返回结果。。。

  • 資深大佬 : pandait

    用鸟哥的那个 blog 的 fsockopen

  • 資深大佬 : realpg

    @frozenway #5 PHP 海量数据下 删除数据、生成数据防卡死的标准操作 自刷新也可以

  • 資深大佬 : ViggoSite

    系统定时任务 或者 workman,简单又方便

  • 資深大佬 : encro

    dnf or apt install php-redist 还好吧
    workerman swoole Gearman 也还好吧
    phpize 也麻烦?

  • 資深大佬 : blurh11E27

    redis 发布订阅

  • 資深大佬 : go522000

    以前用过 fsockopen 做异步请求,挺好用,你可以搜索相关文章参考一下。

  • 資深大佬 : yincrow

    @yincrow 我看了下 swoole 的文档,coroutine 和 process

  • 資深大佬 : sagaxu

    “报告长官,有人在诋毁和攻击 PHP”
    “他都胡说八道些什么?”
    “他竟然把 PHP 特性和技巧讲了一遍”

  • 資深大佬 : msg7086

    建议招个运维,解决一下开 PHP 扩展要编译 PHP 的问题。

  • 資深大佬 : cbasil

    最简单的使用 fsockopen
    $fp = fsockopen ( $hostname, $port, $errno, $errstr, 600 );
    stream_set_blocking ( $fp, 0 ); //开启非阻塞模式
    fputs ( $fp, “GET ” . $url . “rn” );
    fclose ( $fp );

文章導覽

上一篇文章
下一篇文章

AD

其他操作

  • 登入
  • 訂閱網站內容的資訊提供
  • 訂閱留言的資訊提供
  • WordPress.org 台灣繁體中文

51la

4563博客

全新的繁體中文 WordPress 網站
返回頂端
本站採用 WordPress 建置 | 佈景主題採用 GretaThemes 所設計的 Memory
4563博客
  • Hostloc 空間訪問刷分
  • 售賣場
  • 廣告位
  • 賣站?
在這裡新增小工具