【问题标题】:Asynchronous Method Call In PHPPHP中的异步方法调用
【发布时间】:2015-02-10 13:11:16
【问题描述】:

我有以下困境,我有一个SOAP API,需要优化一个方法:

public function myMethodForOptimisation(array $options) {
    //doing some stuff

    $this->requestsAnUltraSlowTimeConsumingMethod();

    return $someData;
}

我真的不需要等待$this->requestsAnUltraSlowTimeConsumingMethod() 的最终确定,我只是想异步告诉这个方法做的事情和return 的结果给客户。

需要将其转换为:

public function myMethodForOptimisation(array $options) {
    //doing some stuff

    async_method_call($this->requestsAnUltraSlowTimeConsumingMethod());

    return $someData;
}

PHP 中有 async_method_call() 吗?

【问题讨论】:

  • 线程或分叉 cURL 请求。无论哪种方式,您都需要一种方法来通知您的主应用程序资源在某个时候可用。
  • 但请注意,它在不同的操作系统以及不同的网络服务器配置上会表现不同。有些方法可能根本不起作用。
  • $someData 来自哪里?你想从你的异步调用中返回一些东西吗?
  • $someData 是在$this->slowMethod() 之前计算的,我建议我的客户将此方法一分为二,并为第一种方法发出 2 个请求,为另一种方法发出第二个请求,但是它告诉我只能在后台找到解决方案

标签: php


【解决方案1】:

您不能异步执行方法。但是您可以将数据返回给客户端,关闭连接,并在断开连接后执行耗时的方法。

This answer goes in details.

另一种异步执行 php 代码的解决方案是使用 pclose(popen()) 分叉一个新进程。

或者对于真正高级的解决方案,您可以查看 PHP 的线程模块。

【讨论】:

  • 嗯,我会测试一下,但我想我必须玩才能将它集成到肥皂中。
【解决方案2】:

您可以使用线程:PHP threading call to a php function asynchronously

这是唯一的方法。有多种使用方式,因此请选择最适合您/最简单的方式。

我正常使用这个:http://php.net/manual/en/class.thread.php

【讨论】:

  • 考虑过了,但是需要以特定的方式编译 PHP,pthreads requires a build of PHP with ZTS (Zend Thread Safety) 没有那么奢侈。
  • 那么你就可以使用DB了。添加要表的数据(id、data、request、anything、flag)。然后设置cronjob。如果标志设置为not done,则在cron 作业中完成作业并将标志设置为done。这可能不是异步的,但它将半工作线程从用户请求移动到服务器端。然后,您可以添加一些简单的带有delayed 请求 id 的 ajax PING,以便用户可以检查何时完成并接收它。
猜你喜欢
  • 1970-01-01
  • 2014-09-28
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-19
相关资源
最近更新 更多