http://flyhighest.com/archives/50

原本没有用过phalcon的消息队列,本来以为很简单,结果搞了半天,把步骤记录一下。

  1. phalcon的官网上没有说需要安装beanstalkd,我猜写文档的以为我等默认会安装,找了半天没有找到windows下的beanstalk,有个国人写的beanstalkd-win,没敢用。
  2. 找了一台Ubuntu,安装上了beanstalkd,命令: sudo apt-get install beanstalkd
  3. 启动:beanstalkd -l 10.0.1.5 -p 11300
  4. 打开11300端口,命令:iptables -A INPUT -ptcp –dport 11300 -j ACCEPT
  5. https://github.com/shruthi-ananth/phalcon-beanstalk 这里有个例子,用来学习phalcon和beanstalk的集成,
    • Once you have Beanstalk server up, you can run producer and worker tasks in the console using ‘php console.php producer main’ and ‘php console.php worker main’. The producer puts a job on the queue and that works fine. The worker(Phalcon implementation) does not pick up a job from the queue to execute unlike the PheanstalkWorker Task.(‘php console.php pheanstalkworker main’). You use ‘php console.php pheanstalkstats main’ to check the server stats and keep both workers running to see which worker picks the job.
  6. 把例子程序里的所有beanstalkd的host和端口号改一下。
  7. 开四个cmd,一个运行php console.php worker main,一个运行 php console.php pheanstalkworker main, 一个运行php console.php pheanstalkstats main ,最后一个运行php console.php producer main。就可以看到任务写入,任务执行过程了
  8. 基本上phalcon的消息队列环境就搭好了。
  9. 照着phalcon官网上的例子写,就可以了:https://docs.phalconphp.com/zh/latest/reference/queue.html

Note:

  1. 抄了一段别人写的代码,  如果把worker的这段代码用supervisor做个守护进程,就更好了。参考http://www.phpddt.com/php/supervisor.html

    • This is not really Phalcon related but here it goes anyway. This shows a simple example of using the queue to generate a response. Your API endpoint only creates a job in the queue and can return immediately.When the item is picked from the queue the request to the external API is made and when a reponse is recieved it calls the callback supplied by the original callee. This example could be improved by splitting the job in two, one job for external api retrieval and a seperate job for the callback. This way the extarnal Api isn’t called agian when the callback fails. This also allows for multiple callback attempts by keeping a counter for failed deliveries.
    • ApiController
      public function myApiEndpointAction($myArgument, $callbackUrl) {
      $queue->put(array(
      'jobName' => $myArgument,
      'callbackUrl' => $callbackUrl
      )); return new Reponse("Item put in queue", 201);
      }

      Worker

      while (($job = $queue->peekReady()) !== false) {
      
          $jobBody = $job->getBody();
      
          if(isset($jobBody['jobName']) {
      $myArgument = $jobBody['jobName'];
      $callbackUrl = $jobBody['callbackUrl']; //Call external API
      $external = curl_init();
      curl_setopt_array($external, array(
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_URL => 'http://external.api.com'
      )); //The reponse from the external API
      $result = curl_exec($external);
      if(!$result) {
      //External api failed
      //Don't delete job, will be pickedup again the next round
      curl_close($external);
      return;
      }
      curl_close($external); //Return the response to the original callee
      $callback = curl_init();
      curl_setopt_array($callback, array(
      CURLOPT_RETURNTRANSFER => true,
      CURLOPT_URL => $callbackUrl, //The url which the original api caller gave
      CURLOPT_POST => true,
      CURLOPT_POSTFIELDS => array(
      data => $result //The response from the external api call
      )
      ));
      $deliverd = curl_exec($callback);
      if(!$deliverd) {
      curl_close($callback);
      return;
      }
      curl_close($callback);
      } //Remove the job from the queue
      $job->delete();
      }

PHP进程的生命周期很短,遇到意外情况也会中断,如果跟想要PHP在后台不断的跑脚本,就需重启它。Supervisor是一个python开发的基于*nix上的管理和监控进程的client/server程序。当PHP进程中断,会重新启动它。
安装:

  1. wget http://pypi.python.org/packages/source/s/supervisor/supervisor-3.0b1.tar.gz
  2. tar –zxvf supervisor–3.0b1.tar.gz
  3. cd supervisor–3.0b1
  4. easy_install supervisor #安装setuptools(yum -y install python-setuptools)

配置:
在/etc/supervisord.conf后添加:

  1. [program:php]
  2. command= /usr/local/php54/bin/php –f /root/supervisor/test.php #被监控进程
  3. ;process_name=%(process_num)02d
  4. ;numprocs=5 #启动几个进程
  5. autostart=true #随着supervisord的启动而启动
  6. autorestart=true #自动启动
  7. startsecs=1 #程序重启时候停留在runing状态的秒数
  8. startretries=10 #启动失败时的最多重试次数
  9. redirect_stderr=true #重定向stderr到stdout
  10. stdout_logfile=/root/supervisor/test.log #stdout文件

命令:
supervisord :启动supervisor sever
supervisorctl:启动supervisor client的命令行窗口。

phalcon: queueing使用心得,需要安装相应的软体的更多相关文章

  1. GitHub学习心得之 安装配置与多帐号管理

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 GitHub学习心得之 安装配置与多帐号管理 1.前言2.GitHub Linux安装(ub ...

  2. wireshark使用心得 centos7安装wireshark: yum install wireshark wireshark-gnome

    centos7 安装wireshark 安装 yum install wireshark yum install wireshark-gnome 关于pcap文件的文件解析网上资料有很多,我在这就不说 ...

  3. idea使用心得(2)-安装设置与创建web项目

    idea 是与eclipse齐名的IDE(集成开发工具),以智能闻名,不过对于熟悉eclipse的的用户来说,初次接触idea有些让人搞不清方向,下面介绍一下简单的使用 方式. 1.安装 官网下载ul ...

  4. windows7股票的,win8残疾人,安装Han澳大利亚sinoxn个时间,sinox它支持大多数windows软体

    腾讯科技: 正如先前所宣布,微软,10一个月31迄今,Windows 7家庭基础版.家庭高级版和旗舰版盒装版本将不再销售.而微软是不会再OEM制造商授予许可数量的三个版本. windows7股票的.由 ...

  5. 每天一个linux命令(23):Linux 目录结构

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  6. linux文件目录详解

    文件系统的是用来组织和排列文件存取的,所以她是可见的,在Linux中,我们可以通过ls等工具来查看其结构,在Linux系统中,我们见到 的都是树形结构:比如操作系统安装在一个文件系统中,他表现为由/起 ...

  7. linux命令:目录结构

      可分享的(shareable) 不可分享的(unshareable) 不变的(static) /usr (软件放置处) /etc (配置文件) /opt (第三方协力软件) /boot (开机与核 ...

  8. 深入理解linux系统的目录结构(总结的非常详细)

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...

  9. linux系统的目录结构

    前言 对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要 ...

随机推荐

  1. LInux ugo权限详解[修]

    Linux 中的用户和组是用来控制使用者或者进程可以或者不可以使用哪些资源和硬件,是Linux权限控制最基本的方式. 用户和组可以看一下上一章的部分,先来看一下权限. 一.权限概览 在Linux下,使 ...

  2. winform中利用反射实现泛型数据访问对象基类(1)

    考虑到软件使用在客户端,同时想简化代码的实现,就写了一个泛型的数据访问对象基类,并不是特别健全,按道理应该参数化的方式实现insert和update,暂未使用参数化,抽时间改进. /// <su ...

  3. 越狱后如何添加cydia源及cydia源大全

    http://jingyan.baidu.com/article/6c67b1d6cc53fe2787bb1e06.html 软件游戏能PJ,插件其实也一样,所以有些源里面就包含了大量的PJ插件~ a ...

  4. 2016年10月28日 星期五 --出埃及记 Exodus 19:13

    2016年10月28日 星期五 --出埃及记 Exodus 19:13 He shall surely be stoned or shot with arrows; not a hand is to ...

  5. HDU1757 A Simple Math Problem 矩阵快速幂

    A Simple Math Problem Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Ot ...

  6. Python3基础 for循环 遍历并输出一个字符串的列表

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  7. [CF738B]Spotlights(前缀和,模拟)

    题目链接:http://codeforces.com/contest/738/problem/B 题意:问多少个0的方向,使得方向上至少有一个1. 四个方向统计一遍前缀和,向上向左正着记,向下向右倒着 ...

  8. [转老马的文章]MODI中的OCR模块

    作者:马健邮箱:stronghorse_mj@hotmail.com发布:2012.07.02更新:2012.07.09补充非简体中文版内容 自从基于MODI的DjVuToy.FreePic2Pdf. ...

  9. 【转】在网页中运行VB6程序

      用VB6做的程序在网页里运行, 需要把程序做成OCX格式,下面简单做一介绍: 首先新建一个工程, 选择ActivX控件: 然后添加控件和代码: 然后F5运行 然后按下图设置,去掉弹出消息阻止 这样 ...

  10. CUBRID学习笔记 28 执行sql脚本文件

    一下命令在csql下执行. insert_commands.sql为sql脚本文件 ;CL ;READ insert_commands.sql ;RU 第一行的cl 清空命令缓存,等同clear第二行 ...