Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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 在mysql插入之前临时存储数据_Php_Mysql - Fatal编程技术网

Php 在mysql插入之前临时存储数据

Php 在mysql插入之前临时存储数据,php,mysql,Php,Mysql,我认为您可以打开的mysql连接数量是有限制的。有没有一种方法可以暂时存储用户的数据,然后一次性插入数据库?或者你会如何管理20万人更新facebook状态?(因为我不知道,你只需打开20万个连接并将信息输入即可。) 谢谢。例如,您可以使用一个队列,通过该队列,单个进程可以获得插入(通过进程间通信,或者通过套接字,即使在这种情况下,您有200.000个到队列服务器的连接,或者通过将文件存储到“spool”目录) 然后,进程“重新获取”队列,在MySQL中可能使用扩展语法合并插入,并将它们发送到D

我认为您可以打开的mysql连接数量是有限制的。有没有一种方法可以暂时存储用户的数据,然后一次性插入数据库?或者你会如何管理20万人更新facebook状态?(因为我不知道,你只需打开20万个连接并将信息输入即可。)


谢谢。

例如,您可以使用一个队列,通过该队列,单个进程可以获得插入(通过进程间通信,或者通过套接字,即使在这种情况下,您有200.000个到队列服务器的连接,或者通过将文件存储到“spool”目录)

然后,进程“重新获取”队列,在MySQL中可能使用扩展语法合并插入,并将它们发送到DB

这只有在将INSERT外包到流程中的整个工作比将其发送到DB快得多的情况下才有用,否则成本和问题(例如,外包后,Web服务器认为DB已更新,但实际上没有更新,而且在收割者到达之前(一小会儿?)不会更新)超过好处

如果reaper进程能够在过载的情况下限制或停止Web服务器,那么您可以使整个进程更具弹性:例如,假设MySQL每分钟只能处理X个插入,即使插入延迟等等,并且入站率也高于此。然后在每次迭代中,收割者进程都会注意到队列正在变长。在给定的限制范围内,进程可能会设置一个标志,以便新用户收到错误消息并阻止生成进一步的插入

在inbound>outbound的情况下,无论如何都会出现一些问题,所以至少这样可以保护现有连接并提供“软故障”模式


您还可以使用共享内存实现一个本地缓存:每个PHP进程都将插入内容放在共享内存中(带有锁定!)。如果有超过X个元组等待,或者如果较旧的元组早于Y秒,则所有元组将合并到一个发送到MySQL的插入中,缓存将清空。通过这种方式,整个过程非常轻量级,不使用网络(但占用一点内存),MySQL上的负载明显减少-合并插入比单独插入快100倍,还可以使用索引禁用/启用技巧。

您可以同时打开200000个连接,同时执行200000个提交。它可能有点慢,但它可以工作。如果你有20万用户,你必须积极使用缓存。所以,您可以在写入数据库之前将数据保存在缓存中。这也将有助于提高性能。否则,您只需打开那么多连接即可。查看此项了解更多信息-在您的示例中,您将缓存200000个更新,这样您可能会耗尽RAM,而不是耗尽连接。运行一个同时有200000个更新的站点不仅仅是让一个站点做一个更新,然后让200000个用户运行它。不要计划得太远。。。