发布于 1970-01-01 08:00
  • 7 个回答
    • 用php-worker模式啊。大致应该如此

      $cache_data = $redis->get_all();
      $redis->flush_all();
      
      $sqlArr = [];
      
      for($item in $cache_data){
          array_push($sqlArr,sql_gen($item));
      }
      
      execute_sqls($sqlArr);
      
      sleep($sleep_time);
      2022-12-01 10:36 回答
    • 后台运行:

      chmod a+x /png/php_daemon #给脚本加上执行权限
      nohup /png/php_daemon >/png/php_daemon.log 2>&1 &

      或者添加到/etc/rc.local,让其开机自启动运行:

      /png/php_daemon >/png/php_daemon.log

      php_daemon内容:

      #!/png/php/7.0.0/bin/php
      <?php
      while(1) {
          //这里写你的业务逻辑代码.
          //注意!每次循环都要显式关闭Redis和MySQL连接.
          //同时要注意对可能的连接失败,操作失败进行处理.
          //另外记得用unset释放掉不再使用的变量,避免内存泄漏.
          sleep(60); //每隔60秒把Redis的数据插入到MySQL中.
      }

      补充:
      PHP提供有2个预定义变量用于PHP脚本接收命令行参数:
      http://php.net/manual/zh/reserved.variables.php
      $argc 传递给脚本的参数个数
      $argv[] 传递给脚本的参数数组

      getopt可以用于获取命令行参数选项,返回一个参数名和值的关联数组.
      http://php.net/manual/zh/function.getopt.php
      单独的字符(不接受值)
      后面跟随冒号的字符(此选项需要值)
      后面跟随两个冒号的字符(此选项的值可选)

      #!/png/php/5.4.39NTS/bin/php
      <?php
      $argv = getopt('a:b:');
      print_r($argv);
      chmod +x cli.php
      ./cli.php -a1024 -b2048 或者 php cli.php -a1024 -b2048

      输出:

      Array
      (
          [a] => 1024
          [b] => 2048
      )

      注释掉 $argv = getopt("a:b:") 输出:

      Array
      (
          [0] => ./cli.php
          [1] => -a1024
          [2] => -b2048
      )
      2022-12-01 10:36 回答
    • 写个daemon不停的读redis就行了。

      1.程序启动
      2.读取新数据(按照timestamp排序获取最旧的)
      3.没有数据,sleep 1秒
      3.有数据,操作mysql,更新最后一次检查的时间戳timestamp

      2022-12-01 10:36 回答
    • 你不知道redis有消息队列功能么,让其它线程用blpop这种阻塞读取的模式从队列里读消息就可以了

      2022-12-01 10:36 回答
    • 2022-12-01 10:36 回答
    • 可以考虑两种方式:
      (1)list作为缓存,借用producer/consumer模式
      (2)Pub/Sub,订阅消息,写MySQL

      2022-12-01 10:36 回答
    • 以前我在stackoverflow上也问过这个问题,好多答案都是说redis用list存,然后设置一个每分钟跑的cron任务去读这个list,为什么不用while (true)是因为长时间执行的php进程可能会造成内存泄漏。

      不过现在我已经在尝试使用rabbitmq来实现队列了,效果也很不错哟。

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