Yii 框架中的 PHP 异步方法调用

2024-02-11

Question

我想知道是否可以在操作呈现视图时从 Yii 控制器方法之一异步调用该方法,让该方法完成长时间运行的操作。我想做类似下面的代码的事情,并且不需要返回结果my_long_running_func.

public function actionCreate() {
    $model = new Vacancies;
    if (isset($_POST['Vacancies'])) {
        $model->setAttributes($_POST['Vacancies']);
        $model->save();
        //I wish :)
        call_user_func_async('my_long_running_func',$model);
    }
    $this->render('create', array( 'model' => $model));
}

Problem

我正在尝试在 Yii 中编写一个控制器操作,用于发布职位空缺并通知对该帖子感兴趣的订阅者。问题是执行通知查询需要很长时间。

现在,我正在寻找一种异步运行查询的方法,以便发布者在尽可能短的时间内看到他的响应,同时查询以类似于 C# 委托或事件的方式在后台运行。

我用谷歌搜索到的解决方案执行异步请求在控制器操作过程中,但我想做的就是异步运行控制器的方法,并且操作必须wait直到要求)已完成。

尝试过

我尝试了以下方法,但是对于我的1500个用户左右的测试数据,查询仍然很慢。

  • Yii 活动记录

    if ($vacancy->save()) {                
        if($vacancy->is_active == 1) {
            $url = Yii::app()->createUrl('vacancies/view',array('id'=>$model->id));
            $trainees = YumUser::getUsersByRole('Trainees');
            if($trainees!=null) {
                foreach($trainees as $trainee){
                    $message = new YumMessage;
                    $message->from_user_id = Yii::app()->user->id;
                    $message->title = 'Vacancy Notification: '.date('M j, Y');
                    $message->message = "A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
                    $message->to_user_id = $trainee->id;
                    $message->save();                
                }
            }
        }    
    }
    
  • Yii 数据访问对象

    if ($vacancy->save()) {        
        if($vacancy->is_active == 1) {
            $url = Yii::app()->createAbsoluteUrl('vacancies/view',array('id'=>$model->id));
            $trainee_ids=Yii::app()->db->createCommand()->select('user_id')->from('trainee')->queryColumn();
            $fid=Yii::app()->user->id;
            $msg="A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
            $ts = time();
            $tt = 'Vacancy Notification: '.date('M j, Y');
            if($trainee_ids!=null) {
                foreach($trainee_ids as $trainee_id){
                    Yii::app()->db->createCommand()
                      ->insert('message',array('timestamp'=>$ts,'from_user_id'=>$fid,'to_user_id'=>$tid,'title'=>$tt,'message'=>$msg));
                }
            }
        }
    }
    
  • 准备好的报表

    if ($vacancy->save()) {                
        if($vacancy->is_active == 1) {
            $url = Yii::app()->createUrl('vacancies/view',array('id'=>$model->id));                    
            $trainee_ids=Yii::app()->db->createCommand()->select('user_id')->from('trainee')->queryColumn();
            $fu=Yii::app()->user->id;
            $msg="A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
            $ts = time();
            $tt = 'Vacancy Notification: '.date('M j, Y');
            $sql="INSERT INTO message (timestamp,from_user_id,title,message,to_user_id) VALUES (:ts,:fu,:tt,:msg,:tu)";
            if($trainee_ids!=null) {
                foreach($trainee_ids as $trainee_id){
    
                    $command=Yii::app()->db->createCommand($sql);
                    $command->bindParam(":ts",$ts,PDO::PARAM_INT);
                    $command->bindParam(":fu",$fu,PDO::PARAM_INT);
                    $command->bindParam(":tt",$tt,PDO::PARAM_STR);
                    $command->bindParam(":msg",$msg,PDO::PARAM_STR);
                    $command->bindParam(":tu",$trainee_id,PDO::PARAM_INT);
    
                    $command->execute();
    
                }
            }
        }
    }
    

Research

我还检查了以下网站(我只允许发布两个链接),但它们要么需要等待请求完成的操作,要么需要curl(我在部署服务器上无权访问)或需要一个外部库。我希望有一个本地 PHP 实现。

  • PHP模拟多线程
  • PHP中的多线程
  • 异步 PHP 调用? https://stackoverflow.com/questions/124462/asynchronous-php-calls
  • PHP 中的异步处理 http://css.dzone.com/articles/asynchronous-processing-php

Edit

通过以这种方式重写查询(将用户循环移至数据库层),我能够大大减少响应时间:

public function actionCreate() {
    $user=YumUser::model()->findByPk(Yii::app()->user->id);
    $model = new Vacancies;
    $model->corporate_id=$user->professional->institution->corporate->id;
    $model->date_posted=date('Y-m-d');
    $model->last_modified=date('Y-m-d H:i:s');

    if (isset($_POST['Vacancies'])) {
        $model->setAttributes($_POST['Vacancies']);
        if ($model->save()) {                
            if($model->is_active == 1) {
                $url = Yii::app()->createAbsoluteUrl('vacancies/view',array('id'=>$model->id));                    
                $fu=Yii::app()->user->id;
                $msg="A new vacancy has been posted at <a href='{$url}'>{$url}</a>.";
                $ts = time();
                $tt = 'New Vacancy: '.$model->title;
                $sql='INSERT INTO message (timestamp,from_user_id,title,message,to_user_id) SELECT :ts,:fu,:tt,:msg,t.user_id FROM trainee t';
                Yii::app()->db->createCommand($sql)->execute(array(':ts'=>$ts,':fu'=>$fu,':tt'=>$tt,':msg'=>$msg));
            }                
            if (Yii::app()->getRequest()->getIsAjaxRequest())
                Yii::app()->end();
            else
                $this->redirect(array('view', 'id' => $model->id));
        }
    }
    $this->render('create', array( 'model' => $model));
}

尽管如此,如果有人可以发布一种异步调用函数的方法,那就太好了。


通常,此类问题的解决方案是在系统中集成消息总线。您可以考虑类似的产品豆茎 http://kr.github.io/beanstalkd/。这需要在您的服务器上安装软件。 我想这个建议将被称为“使用外部库”。

如果您可以访问部署服务器并且可以添加 cronjob (或者系统管理员可以),您可以考虑使用 cronjob 对脚本进行 php-cli 调用,该脚本从数据库中的作业队列读取作业,该队列由控制器填充方法。

如果您无法在正在运行的服务器上安装软件,您可以考虑使用 SAAS 解决方案,例如Iron.io http://www.iron.io/为您托管总线功能。 Iron.io 正在使用所谓的推送队列。通过推送队列,消息总线主动向注册的侦听器执行带有消息内容的请求(推送)。这可能会起作用,因为它不需要您执行卷曲请求。

如果以上都不可行,那么您就束手无策了。另一篇与该主题非常相关的帖子:可扩展、延迟的 PHP 处理 https://stackoverflow.com/questions/3115191/scalable-delayed-php-processing

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Yii 框架中的 PHP 异步方法调用 的相关文章

  • Yii 使用 ajax 进行分页

    我需要使用ajax启用分页 我的代码 控制器 更新内容ajax function actionIndex dataProvider new CActiveDataProvider News array pagination gt array
  • 如何检测Mysql/innodb中的死锁?

    我知道在 Innodb 中使用事务时不可避免地会发生死锁 并且如果应用程序代码正确处理死锁 它们是无害的 正如手册所说 只需再试一次 所以我想知道 如何检测死锁 死锁是否会发出一些特殊的 mysql 错误号 如果重要的话 我正在使用 PHP
  • 检查 PHP 中“@”字符后面的单词

    我现在正在制作一个新闻和评论系统 但是我已经在一个部分上停留了一段时间了 我希望用户能够在 Twitter 上引用其他玩家的风格 例如 用户名 该脚本看起来像这样 不是真正的 PHP 只是想象脚本 3 string I loved the
  • 获取带有计数的不同记录

    我有一张桌子personid and msg列 personid msg 1 msg1 2 msg2 2 msg3 3 msg4 1 msg2 我想得到总计msg对于每个personid 我正在尝试这个查询 select distinct
  • Woocommerce 让产品显示在存档页面中

    我正在尝试让所有产品显示在我商店的存档页面中 我想知道他们的id我正在使用我的一个钩子 它在 wp head 上运行并检查 if is product category 我想以某种方式访问 产品的查询并获取它们的 ID if is prod
  • Apache 访问 Linux 中的 NTFS 链接文件夹

    在 Debian jessie 中使用 Apache2 PHP 当我想在 Apache 的文档文件夹 var www 中创建一个新的小节时 我只需创建一个指向我的 php 文件所在的外部文件夹的链接 然后只需更改该文件夹的所有者和权限文件夹
  • MYSQL - 使用逗号分隔字符串作为变量输入的存储过程

    我希望有人能够提供帮助 我已经创建了我的第一个存储过程 没什么花哨的 但是我遇到了问题 我想给它一个字符串输入 例如 1 2 3 4 5 然后它执行一个简单的操作SELECT FROM TABLE WHERE EAN IN VAR 所以存储
  • posts_search 中的自定义查询

    如何使用此查询作为我的自定义搜索查询 add filter posts search my search is perfect 20 2 function my search is perfect search wp query sWord
  • MySQL 与日语字符

    我试图弄清楚如何创建一个表 以便我可以在其中插入日语名字 现在我有 Type InnoDB Encoding UTF 8 Unicode utf8 Collation utf8 general ci 但是 当我插入字符时 它显示为 当我使用
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • 为什么 iconv 在 php:7.4-fpm-alpine docker 中返回空字符串

    给出以下代码
  • 在 PHP 中撤销 Google 访问令牌

    正如标题所示 我想以编程方式撤销授予的访问令牌 即在 PHP 中 我发现这个他们的网站 https developers google com identity protocols OAuth2WebServer tokenrevoke 但
  • 从Django中具有外键关系的两个表中检索数据? [复制]

    这个问题在这里已经有答案了 This is my models py file from django db import models class Author models Model first name models CharFie
  • PHP 与 MySQL 查询性能( if 、 函数 )

    我只看到这个artice http www onextrapixel com 2010 06 23 mysql has functions part 5 php vs mysql performance 我需要知道在这种情况下什么是最好的表
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • Woocommerce 结账自定义选择字段

    我有以下功能 将选择列表添加到 woo commerce 结账表单中 woocommerce form field airport pickup array type gt select class gt array airport pic
  • Doctrine EntityManager 清除嵌套实体中的方法

    我想用学说批量插入处理 http doctrine orm readthedocs org en latest reference batch processing html为了优化大量实体的插入 问题出在 Clear 方法上 它表示此方法
  • CURL 中的 data-urlencode 是什么意思?

    我搜索了很多个小时试图弄清楚 php curl 中的 data urlencode 是什么 我尝试过这个 但我认为这是不对的 xmlpost object1 file https www lob com goblue pdf 在文档中是 d
  • MySQL 转储未知选项“-no-beep”

    在旧服务器上我使用了mysql转储命令来备份 MySQL 数据库 在新服务器上 MySQL 版本为 5 6 相同的命令给出了错误 unknown option no beep 无论它插入什么 我也在互联网上搜索过 但找不到任何帮助 在 my
  • 如何在 PHP 中从 IP 地址/国家/地区名称查找时区 ID?

    谁能告诉我 PHP 中是否有任何方法可以从 IP 地址或国家 地区名称获取时区区域 例如 亚洲 加尔各答 描述 我正在尝试根据他 她的国家 地区设置用户时区 我从他的 IP 地址获取用户所在国家 地区 但我需要该国家 地区的时区区域 例如

随机推荐

  • 将 NSArray 转换为 NSMutableArray Swift

    我正在尝试转换self assets NSArray to NSMutableArray并将其添加到picker selectedAssets这是一个NSMutableArray 这段代码在 swift 中会是什么样子 Objective
  • 如何强制用户下载图像(如下载 pdf)?

    因此 我编写了一个图像库 其中包含下载原始图像的选项 默认情况下 它显示图像的调整大小版本 我很想知道如何 下面的代码将强制用户保存 pdf 而不是使用浏览器查看它 我希望通过将单击操作与 jQuery 绑定来实现图像 jpg gif pn
  • Material-UI [v0.x] 悬停样式上的 RaisingButton

    我想更改悬停时 Material UI RaisingButton 的样式 但似乎没有特定的选项可以做到这一点 因为悬停时发生的情况是由材料设计指南定义的 然而 当鼠标悬停在按钮上时 有什么方法可以更改按钮的样式 主要是颜色和背景颜色 吗
  • C# 中 itextsharp 中的文本格式设置

    我正在尝试使用我的 C 软件创建 pdf 文件 我在用itextsharp库来创建客户账单收据 但是我无法格式化文本 我们如何格式化pdf文件中的文本 仅新行字符 n似乎正在工作 我们如何使用制表符格式化文本 附件是 pdf 文件中文本的屏
  • 如何在 Unity 中创建一个可以显示由许多小图像组成的纹理的着色器

    所以我想做的是从 SQL 表加载卫星图像并将它们包裹在一个球体周围以创建一个地球仪 我知道我已经加载了所涵盖的图像 我只是不确定如何使我的着色器以正确的方向显示图像 我去了 Unity 论坛并查看了这段代码 https docs unity
  • 从Python中的函数返回错误字符串

    我在 Python 中有一个类函数 它要么返回成功 要么返回失败 但如果失败 我希望它发回特定的错误字符串 我想到了 3 种方法 将变量 error msg 传递给最初设置为 None 的函数 如果出现错误 它将设置为错误字符串 例如 if
  • 如何使用 C# Windows 应用程序将图像从 byte[] 写入 MS WORD

    我尝试从以下位置写入数据FileStream StreamWriter到一个word文件 当数据是文本格式时它工作正常 使用StreamWriter 但是当我尝试同样的方法时Binarywriter 用于将图像写入Word文档 它错误地写入
  • 读取表变量的查询可以在 SQL Server 2008 中生成并行执行计划吗?

    首先 从BOL http msdn microsoft com en us library ms175010 aspx 修改的查询table变量不生成并行查询执行计划 当非常大时 性能可能会受到影响table变量或复杂查询中的表变量被修改
  • 使用 VM 参数导出 jar

    我已经使用 Eclipse 编写了一个 Java 应用程序 该应用程序使用 SWT 作为 UI 看运行 jar 时出现 SWT 异常 线程 main 中出现异常 org eclipse swt SWTException 线程访问无效 htt
  • 使用 Flask 时 PyCUDA 上下文错误

    我正在使用 PyCUDA 来实现 smooth local affine 如图所示here https github com LouieYang deep photo styletransfer tf blob master smooth
  • 如何声明一个字节数组包含非ascii字符而不在python 3中转义

    这是我用python2写的一个例子 usr bin env python coding utf 8 from future import print function import sys struct def pack s list re
  • 如何修改ActiveXObject JS构造函数?

    我需要包装一个 IE ajax 请求以在发生时通知我 即我需要知道何时调用 open var xhr new ActiveXObject Microsoft XMLHTTP 做到这一点的唯一方法 我认为 是实现 ActiveXObject
  • 多个 ajax 调用的 jQuery 回调

    我想在单击事件中进行三个 ajax 调用 每个 ajax 调用都会执行不同的操作并返回最终回调所需的数据 这些调用本身并不相互依赖 它们可以同时进行 但是我希望在所有三个调用完成后进行最终回调 button click function f
  • 使用 Stream 比较两个集合 - anyMatch

    我想比较 a 中是否有任何对象list2存在于一个list1 我可以迭代两个列表并使用比较所有元素 contains 但我想知道是否没有更有效的方法 我发现this https stackoverflow com questions 225
  • 在 oninvalid 消息中创建换行符

    我想在 oninvalid 弹出消息中创建换行符 以便我可以在不同行上列出错误消息的多个要求 这是我试图创建的示例代码
  • R networkD3:单击操作显示节点数据帧的信息

    我有这个代码 library networkD3 Load data data MisLinks data MisNodes new nodes lt MisNodes new nodes var1 lt runif nrow MisNod
  • Android:如何在 Android 应用程序中显示谷歌地图?

    我已经构建了一个应用程序 可以为我进行一些坐标计算 它工作得很好 它也从我构建的数据库中检索点 我现在想做的是当按下菜单按钮时显示地图 我做了一个教程 只是一个地图显示 这就是它运行时所做的一切 但是当我尝试将我所做的事情合并到我的应用程序
  • UTF-8 中的值在 JSON 中被编码为 NULL

    我有一组关键字通过 JSON 从数据库 编码的 UTF 8 传递 其中一些可能具有特殊字符 如 等 这用作自动完成器的一部分 例子 array Coffee Cappuccino Caf 我应该补充一点 来自数据库的数组将是 array C
  • android:webview 未使用自定义 WebViewClient 加载 javascript

    我有一个非常基本的WebView这一直有效 直到我尝试添加自定义webViewClient它停止处理 JavaScript 的地方 难道我做错了什么 是否有另一种方法可以摆脱 WebView 中的地址栏和菜单选项 browser WebVi
  • Yii 框架中的 PHP 异步方法调用

    Question 我想知道是否可以在操作呈现视图时从 Yii 控制器方法之一异步调用该方法 让该方法完成长时间运行的操作 我想做类似下面的代码的事情 并且不需要返回结果my long running func public function