发布于 1970-01-01 08:00
  • 2 个回答
    • 发给消息队列 VS 毫秒级别 >>> 矛盾点在哪里?

      用 Redis 可以做队列吧,Redis 操作每秒读写上万次 ,你把消息放到 Redis 里面也就 1次写操作吧,时间消耗低于毫秒吧。
      所以我觉得 使用队列,完全可以达到你说的毫秒级的需求吧。

      另外,不管通过何种手段执行异步操作,总要伴随时间开销,不可避免。

      2022-11-30 16:09 回答
    • //程序被阻塞10秒
      shell_exec('timeout 10 vmstat 1 >/dev/null 2>&1 &');
      
      //程序不会被阻塞
      pclose(popen('timeout 10 vmstat 1 >/dev/null 2>&1 &', 'r'));
      
      //因此可以异步执行任务
      pclose(popen("timeout 60 php /path/to/task.php '$arg' >/dev/null 2>&1 &", 'r'));

      其中变量$arg是传递给脚本task.php的参数,task.php里通过$argv[1]拿到这个参数.
      timeout 60 表示task.php脚本的最大执行时间60秒,不需要的话可以去掉.
      pclose(popen())实现异步的本质是打开一个进程去执行阻塞代码,
      适用于不要求执行完成后自动返回结果(回调)的异步场景.

      字符串参数$arg可以用单引号括起来,可以避免一些空格的影响,但还是有缺陷.
      字符串参数最好还是serialize序列化到文件,
      然后给脚本task.php传文件路径这个参数,
      让task.php自己读文件unserialize反序列化拿数据.
      文件名应该做到唯一,比如可以是用户ID或者进程PID加上时间随机数:

      $filename = md5(uniqid($uid.'_',        true));
      $filename = md5(uniqid($getmypid().'_', true));
      2022-11-30 16:09 回答
    撰写答案
    今天,你开发时遇到什么问题呢?
    立即提问
    PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有