从beantalk调用函数

时间:2019-02-25 11:21:47

标签: php asynchronous phalcon amazon-elastic-beanstalk beanstalkd

我在PHP中有一个函数,该函数执行一些需要异步调用另一个函数的任务。

public abstract class Pointerable { }

public class Dog extends Pointerable {
    public void bark() {
        System.out.println("Bark ...");
    }
}

public class Pointer extends Pointerable {

    private Object myObj;

    public <T extends Pointerable> void ref(T myObject) {
        this.myObj = myObject;
    }

    public <T extends Pointerable> T deref(Class<T> myClazz) {
        try {
            return myClazz.cast(myObj);
        } catch(ClassCastException e) {
            return null;
        }
    }
}

我做了一些研究,并被告知我需要使用beantalk来实现这一目标,但是我对如何实现它感到困惑,因为我找不到任何文档或教程来做到这一点。

这是异步函数的外观

function doTask1() {
    // some task
    asyncTask()
}

想法是function asyncTask(){ // raise an event console.log("event raised"); } 中的功能doTask1()应该继续执行并完成。

1 个答案:

答案 0 :(得分:0)

我们在此进行管理的方法是从php cli启动第二个任务。

在任务1中:

  1. 将要传递给params的参数放在管道中
  2. 使用异步功能调用脚本
  3. 继续执行任务1 ...

在Task2中:

  1. 打开Beanstalk管
  2. 获取参数
  3. 做您需要的!
function doTask1() {
    // some task

    // 1. Open the tube (here in a Phalcon framework app) and fill the params
    $queue = $this->di->getShared("queue", ["tube" => "myAsyncTube"]);
    $idQueue = $queue->put([
        "myparam1" => $this->param1,
        "myparam2" => $this->param2
    ],[
        "priority" => 250,
        "delay" => 10, 
        "ttr" => 3600 
    ]);

    // 2. Call the async task (man bash !)
    exec('bash -c "exec nohup setsid php -q /var/www/asyncTask.php /dev/null 2>&1 &"');

    // finish some tasks
}

在asyncTask.php中:

<?php
    // 1. Get the tube
    $queue = $this->di->getShared("queue", ["tube" => "myAsyncTube"]);
    // 2. Execute all the queued tasks of the tube
    While($job = $queue->peekReady() !== false){
          $job = $queue->reserve();
          $message = $job->getBody();

          $this->param1 = $message['param1'];
          $this->param2 = $message['param2'];

          // Do all the time consuming job you want !

    }

有关bash参数的说明:

  • nohup:将作业与会话分离(因此它将继续)
  • setsid:在一个新会话中(单独的环境)
  • php:几乎可以是您想要的任何可执行二进制文件!
  • /var/www/asyncTask.php:具有第二个功能的文件
  • / dev / null 2>&1:我们不需要日志,因此将所有重定向到回收站
  • &:这是关键:向后运行此命令并返回到提示,因此exec()可以完成,而task1可以继续!

还请注意,由于task2向后运行,它无法将任何内容返回给task1,但可以将响应放入另一个管中,以通知其他订阅者该任务已完成,等等!!

++

Rom1deTroyes