使用PHP和mySQL的异步事务

使用PHP和mySQL的异步事务,php,mysql,Php,Mysql,当某个动作发生在站点上(内置于PHP和MySQL中)时,我希望在站点上很少发生异步的事情 例如,当用户回答问题、上载文档时,我希望在后台发生一些异步事件,例如: 1.更新用户的分数 2.在Facebook墙上发布消息 3.跟踪用户操作 什么样的PHP、JavaScript和MySQL技术最适合实现这一点?请帮忙 我想要MySQL触发但希望异步发生的东西。我能想到的唯一两个选项是消息队列和异步ajax 第一个选项的工作原理是将作业放入数据库,然后一个计划的php程序将循环遍历数据库中的每个作业并运

当某个动作发生在站点上(内置于PHP和MySQL中)时,我希望在站点上很少发生异步的事情

例如,当用户回答问题、上载文档时,我希望在后台发生一些异步事件,例如: 1.更新用户的分数 2.在Facebook墙上发布消息 3.跟踪用户操作

什么样的PHP、JavaScript和MySQL技术最适合实现这一点?请帮忙


我想要MySQL触发但希望异步发生的东西。

我能想到的唯一两个选项是消息队列和异步ajax

第一个选项的工作原理是将作业放入数据库,然后一个计划的php程序将循环遍历数据库中的每个作业并运行它们

第二种方法是使用ajax调用php程序

对于第一个选项,请查看以下内容:

关于jquery及其ajax选项:

我能想到的唯一两个选项是消息传递队列和异步ajax

第一个选项的工作原理是将作业放入数据库,然后一个计划的php程序将循环遍历数据库中的每个作业并运行它们

第二种方法是使用ajax调用php程序

对于第一个选项,请查看以下内容:

关于jquery的第二个方面,它的ajax选项:

您可以使用消息队列服务器。

您可以使用消息队列服务器。

您还可以使用php系统调用在后台运行另一个程序:

您还可以使用php系统调用在后台运行另一个程序:

最好的选择是使用exec和将输出传递给null,如下所示

exec(“/usr/bin/php somescript.php>>some\u log\u file.log 2>&1&”)

对三个函数的三个脚本执行相同的exec将同时/异步执行所有这三件事。这就是你所追求的

如果您将作业添加到作业队列中,然后让cron清除该队列,则您的任务并不是真正异步执行的。您仍在以同步阻塞方式一个接一个地进行操作,尽管用户并不等待这些操作的发生。如果您的站点具有高流量,那么清除队列时可能也会有延迟,exec将无法获得相同的延迟。因为脚本将立即执行,并与初始请求同时执行


旁注:这就是Node.js变得如此流行的原因,它是基于JavaScript构建的,而JavaScript是为这种开发方法而设计的。异步和事件驱动。

最好的选择是使用exec调用三个单独的PHP脚本,并将输出传递给null,如下所示

exec(“/usr/bin/php somescript.php>>some\u log\u file.log 2>&1&”)

对三个函数的三个脚本执行相同的exec将同时/异步执行所有这三件事。这就是你所追求的

如果您将作业添加到作业队列中,然后让cron清除该队列,则您的任务并不是真正异步执行的。您仍在以同步阻塞方式一个接一个地进行操作,尽管用户并不等待这些操作的发生。如果您的站点具有高流量,那么清除队列时可能也会有延迟,exec将无法获得相同的延迟。因为脚本将立即执行,并与初始请求同时执行

旁注:这就是Node.js变得如此流行的原因,它是基于JavaScript构建的,而JavaScript是为这种开发方法而设计的。异步和事件驱动。

使用swoole扩展。

asyc mysql示例:

$db = new mysqli;
$db->connect('127.0.0.1', 'root', 'root', 'test');
$db->query("show tables", MYSQLI_ASYNC);
swoole_event_add(swoole_get_mysqli_sock($db), function($__db_sock) {
    global $db;
    $res = $db->reap_async_query();
    var_dump($res->fetch_all(MYSQLI_ASSOC));
    exit;
});
使用swoole扩展。

asyc mysql示例:

$db = new mysqli;
$db->connect('127.0.0.1', 'root', 'root', 'test');
$db->query("show tables", MYSQLI_ASYNC);
swoole_event_add(swoole_get_mysqli_sock($db), function($__db_sock) {
    global $db;
    $res = $db->reap_async_query();
    var_dump($res->fetch_all(MYSQLI_ASSOC));
    exit;
});