【问题标题】:PHP command line persistent connectionsPHP 命令行持久连接
【发布时间】:2013-12-09 18:23:47
【问题描述】:

我有一个 PHP 脚本,它通过浏览器调用的 Apache 完美运行,但在命令行上调用的相同代码似乎在每次调用后都会断开数据库连接。

例如,在一个包含的文件中,我有:

$pdo = new PDO('mysql:host=' . HOST . ';dbname=' . DB, USER, PASS, array(PDO::ATTR_PERSISTENT => true));

然后在我的脚本中:

$stmt = $pdo->prepare('SELECT intGroupID FROM tblquestiongroups WHERE dtDeleted IS NOT NULL ORDER BY RAND()');
$stmt->execute();
$something = $stmt->fetch(PDO::FETCH_ASSOC);

效果很好,但之后我直接拥有:

$stmt = $pdo->prepare('SELECT intSurveyID FROM tblquestiongroups WHERE tblquestiongroups.intGroupID = :intQuestionId');
$stmt->bindValue(':intQuestionId', $intQuestionId); 
$stmt->execute();

哪个不返回:

Call to member function bindValue() on a non-object

现在,如果我添加一个新连接,即在第二次调用上方的包含文件中复制并粘贴该连接,则一切正常,即:

$pdo = new PDO('mysql:host=' . HOST . ';dbname=' . DB, USER, PASS, array(PDO::ATTR_PERSISTENT => true));
$stmt = $pdo->prepare('SELECT intSurveyID FROM tblquestiongroups WHERE tblquestiongroups.intGroupID = :intQuestionId');
$stmt->bindValue(':intQuestionId', $intQuestionId); 
$stmt->execute();

我的第一个问题是为什么 PHP 不会在脚本期间保持连接打开?

那么我的第二个问题。作为测试,我在所有通过 PDO 调用数据库之前完成并添加了连接。在这个脚本中,我实际上连接到两个不同的服务器,因此我定义了另一个连接,如下所示:

$pdoLocal = new PDO('mysql:host=' . HOST_LOCAL . ';dbname=' . DB_LOCAL, USER_LOCAL, PASS_LOCAL, array(PDO::ATTR_PERSISTENT => true));

所以当然要尝试让事情正常工作,我已经在对本地数据库的任何调用上方添加了这一行。但是使用此代码:

$pdoLocal = new PDO('mysql:host=' . HOST_LOCAL . ';dbname=' . DB_LOCAL, USER_LOCAL, PASS_LOCAL, array(PDO::ATTR_PERSISTENT => true));   
$pdoLocal->beginTransaction();
$stmtInsert = $pdoLocal->prepare('INSERT INTO tblresponses_string (strResponses, intSurveyID) VALUES (:strResponses, :intSurveyID)');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $stmtInsert->bindValue(':strResponses', $row['strResponses']);  
    $stmtInsert->bindValue(':intSurveyID', $surveyID);  
    $stmtInsert->execute();

}
$pdoLocal->commit();

我在第一次绑定时遇到同样的错误。

我想这是同样的问题,因为要执行的第一条语句是 beginTransaction,然后 PDO 连接关闭。

如前所述,这一切都可以通过 Apache 正常工作。

感谢所有帮助。

【问题讨论】:

  • 您应该打开异常以查看是否出现错误。
  • on a non-object 表示您的准备以某种方式失败,几乎可以保证返回布尔值 false。由于您假设一切总是成功的,因此您不必费心检查失败。检查返回值(pdo 在失败时返回布尔值 FALSE),或者打开异常并开始在 try/catch 块中拍打。

标签: php mysql pdo persistent-connection


【解决方案1】:

你的猜测是错误的。

如果 PHP 确实断开了连接,那么您的错误不是在 bindValue 调用中,而是在使用 PDO 连接的那一行,因此,错误将是

Call to member function prepare() on a non-object

所以,问题不在于连接,而在于查询。将 PDO 设置为错误模式:

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

然后查看错误消息,然后修复它或询问有关此特定错误的另一个问题。

【讨论】:

  • 我不知道我能够设置该属性(对 PDO 来说有点新)。在这样做时,它给了我一个关于缓冲的错误。似乎 ->fetch() 缓冲了结果并且不允许进一步的 SQL 语句执行。解决方案是使用 ->fetchAll 返回所有结果,从而释放 MySQL 以返回其他查询的结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 1970-01-01
  • 2017-05-28
  • 2014-04-28
相关资源
最近更新 更多