Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 打电话的最佳方式;“忘记”是什么意思;异步mysqlnd插入查询 这是复制品吗?_Php_Asynchronous_Mysqli_Mysqlnd - Fatal编程技术网

Php 打电话的最佳方式;“忘记”是什么意思;异步mysqlnd插入查询 这是复制品吗?

Php 打电话的最佳方式;“忘记”是什么意思;异步mysqlnd插入查询 这是复制品吗?,php,asynchronous,mysqli,mysqlnd,Php,Asynchronous,Mysqli,Mysqlnd,我查过了,我想没有。关于异步mysql有很多问题,但我对一个特定的问题感兴趣: 安装程序 在这种情况下,我正在使用php和mysql 假设我有这样的mysqli连接: $link = new mysqli('localhost', 'root', 'password', 'A_Database'); 我已安装mysqlnd,以使用“mysql\u ASYNC”参数执行异步mysql查询: $link->query("INSERT INTO `A_Table` VALUES('stuff!

我查过了,我想没有。关于异步mysql有很多问题,但我对一个特定的问题感兴趣:

安装程序 在这种情况下,我正在使用php和mysql

假设我有这样的mysqli连接:

$link = new mysqli('localhost', 'root', 'password', 'A_Database');
我已安装mysqlnd,以使用“mysql\u ASYNC”参数执行异步mysql查询:

$link->query("INSERT INTO `A_Table` VALUES('stuff!')", MYSQLI_ASYNC);
目标 我只想插入一条记录,我不需要检索它,直到遥远的将来,所以我不关心异步查询需要多长时间才能完成,当我知道查询完成时,我也不需要执行一些最后的操作。一旦我完成了插入查询所在的代码部分,我确实需要执行其他不相关的mysql查询

问题 执行这样的查询将阻止脚本中稍后出现不同步错误的其他查询。为了解决这个问题,我必须在每次异步查询后添加类似以下代码的内容:

$links = $errors = $reject = array($link);
if ($link->poll($links, $errors, $reject, 1)) {
    foreach ($links as $resultLink) {
        if ($result = $resultLink->reap_async_query()) {
            if (is_object($result)) {
                $result->free();
            }
        }
    }
}
这有效地阻止了不同步错误,我的代码工作正常。
有两件事仍然困扰着我:

1) 我不想为此费心,因为我只执行插入查询,当我知道插入已完成时,我不关心代码中是否有响应

2) 轮询代码在我的服务器上运行非常慢;比执行常规查询和同步返回结果慢得多

扼要重述 我想用两个要求运行insert查询;查询是非阻塞的(异步的),以后我仍然可以执行其他mysql查询。我只想插入查询并“忘记它”,然后继续我的代码


关于什么是最好的方法,有什么建议吗?

如果您希望能够触发并忘记您的查询,您当前的方法基本上是正确的,尽管我建议您所经历的缓慢可能是因为您在
$link->poll($links,$errors,$reject,1)
中将“1”设置为“secs”参数。这意味着轮询将等待查询返回最多1秒。如果将其设置为“0”,则它不会等待,它将更快地返回查询是否完成的答案

其次,如果您不需要这个查询的答案,您可以在执行这个查询时做其他事情,如果您有其他事情要做,您不必坐在那里等待它在异步轮询循环中返回。这就是异步查询的设计目的。我建议您在queryexecute方法中添加检查,以检查是否已经执行了一个未完成的异步查询,因此每当您需要启动一个新查询时,只有在那时,才会轮询服务器,并等待以前的任何查询完成并可用

或者,如果您希望运行多个互不影响或互不依赖的查询,那么没有什么可以阻止您设置多个数据库连接并对所有数据库连接并行运行异步查询,或者在需要时设置新连接并执行查询

如果您想将SQL完全外包给另一个进程(不使用cron),一种方法是设置一个持久监视脚本,例如使用/这样您就可以向它发送查询,并让它在与本地进程不同的进程(甚至服务器)中处理查询。这样做的好处是远程脚本作为CLI应用程序执行,因此具有更大的使用和处理能力,并且可以在较少暴露的环境中运行


另一种方法(可选使用cron)是使用一个写优化(可能在内存中)的本地数据库表,快速执行对该表的插入,然后使用另一个进程间歇性地读取该表(或者设置为监视新条目),并让该进程从该表中获取新插入的行,并将它们移动到较慢的主表中。

如果您的目标是插入记录并继续执行代码,而不必担心结果,则可以使用语法,而无需使用异步标志:

$link->query("INSERT DELAYED INTO `A_Table` VALUES('stuff!')" );

它立即返回,您可以继续在同一连接上执行新查询。我们在日志系统中使用它。

1。你找错人了。2.即使是这种错误的方式,你也过度设计了。你真正想要的是尽可能快地插入内容,让你忘记所有这些浪漫的想法。插入内容非常小,不能再优化了。我希望避免的步骤是等待我的服务器与mysql服务器联系。另外,我认为@Your Common Sense是一个很好的观点。这是真的,但我希望能给出一个避免cron工作的答案(我正试图让你们了解这个项目的所有细节)。我不能确定我在这里寻找的东西是否可能,但这似乎是异步sql服务应该提供的一个功能-因此,如果有这样的解决方案,我想了解一下。如果服务器之间的ping真的是您的问题,那么,经过这么长时间,显然没有什么异步的东西能帮到你——这正是我想要的!注意“从MySQL 5.6.6开始,INSERT DELAYED已被弃用,并将在将来的版本中删除。请改用INSERT(无延迟)。”不适用于InnoDB表,引擎As功能不支持