mysqli连接可以并行工作吗?
我正在开发一个需要执行多个数据库事务的PHP应用程序。mysqli连接可以并行工作吗?
我已经创建了我找回这样的单身:
$db = DBHelper::getInstance();
而且它下面
self::$conn = new mysqli(self::DBServer, self::DBUser, self::DBPass, self::DBName);
以后,我的几个实用方法。
阅读下面的代码:
$sql = "SELECT `id`, `name` FROM lamp";
$statement = self::$conn->prepare($sql);
$statement->execute();
$statement->bind_result($id, $name);
$lamps = array();
while($statement->fetch())
{
$lamp = self::getLampById($id);
array_push($lamps, $lamp);
}
和方法getLampById正是:
PHP Fatal error: Call to a member function bind_param() on a non-object in...
我想:
$sql = "SELECT `id`, `name` FROM lamp WHERE `id` = ?";
$statement = self::$conn->prepare($sql);
$statement->bind_param('i', $id);
[...]
最后一行,结合参数;这里的一个崩溃这是因为我使用了相同的$conn
变量。请注意,如果我保存这些ID,则关闭$conn
,然后通过其ID请求每盏灯,它正在工作,因为我正在不断打开和关闭连接。
我明白这一点,因为我使用的是单身人士。
但现在想象一下,我在相同的确切秒内运行这个PHP脚本两次。两个“线程”会使用相同的代码和属性吗?
我有点失落PHP如何执行它的代码。
希望我已经解释过自己够好了。
谢谢。
引述评论,因为他不是在写一个答案:
php does not have threads, a singleton in php is only unique to the particular page cycle, 100 different users will access 100 different instances of this singleton – Steve
你的代码失败,因为在该行一个错字:
$sql = "SELECT `id`, `name`FROM lamp WHERE `id` = ?";
^-- missing space
并没有其他原因。
检查你函数返回:
if(! $statement = self::$conn->prepare($sql)) {
throw new Exception($conn->error);
}
至于你的“并行”的问题,你的单例类是每个脚本实例,不作为,使一个请求,每个用户的单个对象。没有并发问题。
你可以有多个连接打开,但由于PHP是单线程和单独的查询()调用将被阻塞,不能发出平行地进行两个查询,然后静坐等待或者作出回应。 PHP本身将强制执行查询的串行执行。 – 2014-09-22 21:17:53
因此,在同一个php文件上的两次执行永远不会发生冲突,对吧? – Reinherd 2014-09-22 21:19:08
php没有线程,php中的singleton只对特定的页面循环是唯一的,100个不同的用户将访问这个singleton的100个不同的实例 – Steve 2014-09-22 21:19:38