使用codeigniter的数据库类(例如$ this-> db)时,有两种不同的http请求使用相同的mysql连接/会话吗?我听说有些框架会这样做,但是,我的项目很好,取决于codeigniter不希望这样做的希望。因为,我正在创建临时表,并且每个请求都需要有一个单独的临时表,而不是共享它们。任何人都可以澄清吗?
我也在使用表格锁定。
答案 0 :(得分:2)
YES。如果您的框架配置使用持久连接,则所有临时表将从一个调用到另一个调用。如果您没有使用持久连接,那么db连接将在脚本结束时自动被杀死,您的下一个脚本将重新开始。如果您在呼叫中依赖临时表并且它们需要不同,请小心。根据MYSQL的网站:
TEMPORARY表仅对当前连接可见,并在>时自动删除。连接已关闭。这意味着两个不同的连接可以使用相同的临时表 名称没有相互冲突或与现有的同名非TEMPORARY表冲突。
http://dev.mysql.com/doc/refman/5.1/en/create-table.html
你提到了框架,所以这里是CodeIgniter中的一个例子。创建一个控制器。我们的调用是CTRL,然后是一堆方法step1,step2,step3,step4。你只需要1和2,但我有点过分了:
function step1()
{
$this->your_model->db->query("CREATE TEMPORARY TABLE test (col1 int null);");
$this->your_model->db->query("INSERT INTO test values (1);");
}
function step2()
{
$res = $this->your_model->db->query("SELECT * from test;");
print_r($res->result_array());
}
function step3()
{
$this->your_model->db->query("INSERT INTO test values (2);");
$this->your_model->db->query("INSERT INTO test values (3);");
}
function step4()
{
$res = $this->your_model->db->query("SELECT * from test;");
print_r($res->result_array());
}
如果您在'pconnect'设置为TRUE的情况下运行上述操作,请在以下时间执行以下操作:
http://yoursite/CTRL/step1
http://yoursite/CTRL/step2
http://yoursite/CTRL/step3
http://yoursite/CTRL/step4
您将插入数据,然后从一个调用显示到另一个调用,这意味着您的TEMP表仍然存在。
现在,将'pconnect'更改为FALSE,退回服务器并重新运行上面的内容,您得到:
Table 'yourdb.test' doesn't exist
SELECT * from test;
Filename: C:\yourpath\system\database\DB_driver.php
答案 1 :(得分:0)
HTTP是一种无状态协议,因此 - 每个PHP脚本都在不同的请求上执行和终止,因此无法在请求之间维护任何持久连接,除非它由外部处理处理。即使您使用带有Keep-alive的HTTP / 1.1,即使多个HTTP请求由单个Apache(例如)进程/线程和连接处理 - 单独的请求仍然代表不同的脚本执行。这不需要对CodeIgniter做任何事情。 但是,如果您为数据库连接设置了pconnect,则PHP将尝试尽可能重用相同的数据库连接。这仍然不意味着它是同一个会话。