例如,假设我有一个脚本,可以直接(不缓存)从数据库(MySQL)读取/更新/删除数据。如果此时有n个并发请求执行此脚本,则此时也有n个到数据库的连接,对吗?先谢了
wljmcqd81#
在PHP中,数据库连接是resources。资源不在请求之间共享。例如,您不能在一个PHP请求中打开一个文件句柄,而在另一个PHP请求中使用该文件句柄。资源在请求结束时自动关闭。每个需要读取或写入数据库的请求都会打开自己的数据库连接。如果多个请求同时运行,则数据库可能会有多个连接。但也有例外:PHP脚本不一定在启动时立即打开数据库连接,或者它可能在脚本完成之前关闭数据库连接。或者另一个PHP脚本可能根本不需要访问数据库,因此它跳过打开数据库连接。因此,您可能有并发的PHP请求正在执行,但不是所有请求都拥有打开的数据库连接。这取决于您的代码,这就是上面一些评论模棱两可的原因。也就是说,常见的PHP编码实践是在脚本启动后立即打开数据库连接,并在请求期间保持打开状态,在脚本退出时依靠PHP垃圾收集关闭数据库连接。因此,我认为在任何典型的PHP应用程序中,多个并发请求都会占用相同数量的并发数据库连接。您可以使用MySQL查询工具进行检查:
SHOW GLOBAL STATUS LIKE 'Threads_connected';
SHOW GLOBAL STATUS LIKE 'Max_used_connections';
SHOW PROCESSLIST;
1条答案
按热度按时间wljmcqd81#
在PHP中,数据库连接是resources。资源不在请求之间共享。例如,您不能在一个PHP请求中打开一个文件句柄,而在另一个PHP请求中使用该文件句柄。资源在请求结束时自动关闭。
每个需要读取或写入数据库的请求都会打开自己的数据库连接。如果多个请求同时运行,则数据库可能会有多个连接。
但也有例外:PHP脚本不一定在启动时立即打开数据库连接,或者它可能在脚本完成之前关闭数据库连接。或者另一个PHP脚本可能根本不需要访问数据库,因此它跳过打开数据库连接。因此,您可能有并发的PHP请求正在执行,但不是所有请求都拥有打开的数据库连接。这取决于您的代码,这就是上面一些评论模棱两可的原因。
也就是说,常见的PHP编码实践是在脚本启动后立即打开数据库连接,并在请求期间保持打开状态,在脚本退出时依靠PHP垃圾收集关闭数据库连接。
因此,我认为在任何典型的PHP应用程序中,多个并发请求都会占用相同数量的并发数据库连接。
您可以使用MySQL查询工具进行检查:
SHOW GLOBAL STATUS LIKE 'Threads_connected';
显示运行此命令时打开的客户端连接的当前数量。SHOW GLOBAL STATUS LIKE 'Max_used_connections';
显示了过去(自上次重新启动MySQL服务器以来)连接的高水位线。SHOW PROCESSLIST;
显示当前连接的详细信息,如它们正在运行的SQL语句(如果在SQL语句之间处于空闲状态,则显示"Sleep")。