【发布时间】:2016-10-18 12:46:03
【问题描述】:
目标
我的基本目标是使用 Yii2 Web 应用程序在 PHP 中实现异步触发器
我需要运行 php 批处理作业,但我不想在 浏览器/cron 中等待完成这项工作。 为了运行作业,我需要使用我的应用程序的不同文件,例如
http://myapp/foojob.php
foojob.php 应该是异步调用多个 php 实例[每个实例携带一个作业] 根据手头的可用作业。调用(foojob.php)的时间限制小于60秒。我需要在超过超时值之前触发新的php实例。
我推荐并尝试过
- curl_multi - 我在其中找不到非阻塞模式。
- fsock_open - 这可以通过发送 Connection: Close 来实现(但是 fsock open 在许多共享托管服务器上并不总是可用,或者它不能正常工作)。您能否向我推荐任何使用 fsock 传输的可靠解决方案?
- pcntl_exec - 我没有实时尝试,但实时统计显示 45% 的服务器禁用了该功能。我不知道为什么。
- 流传输 - 我不知道它是如何工作的?
我的问题:
- 非阻塞异步请求 git 中是否有任何可能的解决方案可以在 PHP 中实现?
- 如果我需要研究任何其他传输方式,请联系我
- 有没有基于环境的智能切换传输机制(curl/fsock)?
编辑:
该应用程序是自托管产品。它将在各种托管服务上工作。共享主机不允许/为其客户提供任何外部扩展。
【问题讨论】:
-
你看php-rescue了吗?
-
@old_mountain 谢谢。我看过了。它需要 redis Redis 2.2+。对于我们的案例来说,没有任何硬依赖会更好?
-
你检查
ignore_user_abort()了吗?如果你有 unix 盒子让它工作,你可以使用nohup。 -
试试 rabbitMQ - 它是作业调度程序(队列)。您创建作业,然后创建调度程序启动第一个作业。
标签: php curl asynchronous yii2 nonblocking