【发布时间】:2016-10-08 16:54:49
【问题描述】:
请原谅我这个问题,我对 PHP 很陌生,在任何地方都找不到我的问题的答案。
我需要在我使用 javascript 和 AJAX 设置的定时内部不断更新从用户到服务器的数据。
有没有办法设置php,这样一旦连接到服务器,它就会保持连接打开并继续接受新数据,直到我告诉它关闭?
【问题讨论】:
标签: javascript php mysql pdo
请原谅我这个问题,我对 PHP 很陌生,在任何地方都找不到我的问题的答案。
我需要在我使用 javascript 和 AJAX 设置的定时内部不断更新从用户到服务器的数据。
有没有办法设置php,这样一旦连接到服务器,它就会保持连接打开并继续接受新数据,直到我告诉它关闭?
【问题讨论】:
标签: javascript php mysql pdo
为什么要保持连接打开?
当您第二次发送数据时,该页面的新实例将在服务器上的 PHP 中运行并继续处理您的请求。数据库连接一旦打开就应该在事务发生后立即关闭,否则它不会释放资源以供其他查询运行。
假设有 2 个用户在使用您的应用程序,如果第一个用户开始发送一些数据,然后在发送更多数据之前等待,并且服务器保持与数据库的连接打开,那么用户 2 将无法处理它请求,因为数据库当前被用户 1 的请求占用。
我强烈建议您为每组数据单独打开和关闭连接。
【讨论】:
我认为您真正需要的是单例数据库连接模型,因此:您将获得一个静态实例以供重用。
class DB {
private $_connection;
private static $_instance; //The single instance
private $_host = MY_HOSTNAME;
private $_username = MY_USERNAME;
private $password = MY_PASSWORD;
private $_database = MY_DBNAME;
public static function getInstance() {
if(!self::$_instance) { // If no instance then make one
self::$_instance = new self();
}
return self::$_instance;
}
// Constructor
private function __construct() {
$this->_connection = new mysqli($this->_host, $this->_username,
$this->_password, $this->_database);
if(mysqli_connect_error()) {
trigger_error("Failed to conencto to MySQL: " . mysql_connect_error(),
E_USER_ERROR);
}
}
private function __clone() { }
// Get mysqli connection
public function getConnection() {
return $this->_connection;
}
// Force mysqli connection to close
public function closeConnection() {
return mysqli_close($this->_connection);
}
}
【讨论】:
你可以为 MySQL 设置一个persistent connection:
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(PDO::ATTR_PERSISTENT => true
));
?>
但是,Web 应用程序中的持久连接可能会产生严重的问题。有关持久性数据库连接的详细讨论,请参阅此处的 What are the disadvantages of using persistent connection in PDO 主题。
在 MySQL 中,创建和关闭数据库连接没有显着的开销,因此每次调用 php 脚本时只需建立一个新连接。
【讨论】: