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如何执行它的代码。

希望我已经解释过自己够好了。

谢谢。

+0

你可以有多个连接打开,但由于PHP是单线程和单独的查询()调用将被阻塞,不能发出平行地进行两个查询,然后静坐等待或者作出回应。 PHP本身将强制执行查询的串行执行。 – 2014-09-22 21:17:53

+0

因此,在同一个php文件上的两次执行永远不会发生冲突,对吧? – Reinherd 2014-09-22 21:19:08

+0

php没有线程,php中的singleton只对特定的页面循环是唯一的,100个不同的用户将访问这个singleton的100个不同的实例 – Steve 2014-09-22 21:19:38

引述评论,因为他不是在写一个答案:

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); 
} 

至于你的“并行”的问题,你的单例类是每个脚本实例,不作为,使一个请求,每个用户的单个对象。没有并发问题。

+0

它只是某种形式的pseodo代码,除非[...]意味着某种可执行文件... – Reinherd 2014-09-22 22:05:09

+1

@SergiCastellsaguéMillán然后,请指教我如何从伪代码中获得PHP错误消息,就像您在您的引用中题。我渴望知道。无论如何,您准备失败的原因可能是由于查询中的拼写错误。 – Sammitch 2014-09-22 22:06:43

+0

不要这样..我没有要求“修复我的代码”。这个问题很清楚。下次只是阅读其他用户的评论,你会发现你是唯一理解不同的用户... – Reinherd 2014-09-22 22:11:14

就我所知,唯一可以做到这一点的方法是使用pthreads,pcntl_fork或reactphp