解决“ MySQL服务器已消失”错误
我已经在PHP中编写了一些代码,这些代码从.edu域返回html内容。这里简要介绍:PHP中有关Web爬网程序的错误
当要爬网的链接数量很少(大约40个URL)时,该爬网程序运行良好,但是在此数量之后我收到“ MySQL服务器已消失”错误。
我将HTML内容作为长文本存储在MySQL表中,但我不明白为什么在插入至少40-50次后错误会到达。
在这方面的任何帮助都将受到高度赞赏。
请注意,我已经更改了wait_timeout和max_allowed_packet以适应我的查询和php代码,现在我不知道该怎么办。请在这方面帮助我。
回答:
您可能倾向于通过在查询之前“ ping”
MySQL服务器来解决此问题。这是一个坏主意。有关为什么的更多信息,请查看以下SO帖子:在每次查询之前都应该ping
mysql服务器吗?
解决此问题的最佳方法是将查询包装在try/catch
块中并捕获任何数据库异常,以便您可以适当地处理它们。这在长时间运行和/或守护程序类型的脚本中尤其重要。因此,这是一个非常基本的示例,使用“连接管理器”来控制对数据库连接的访问:
class DbPool { private $connections = array();
function addConnection($id, $dsn) {
$this->connections[$id] = array(
'dsn' => $dsn,
'conn' => null
);
}
function getConnection($id) {
if (!isset($this->connections[$id])) {
throw new Exception('Invalid DB connection requested');
} elseif (isset($this->connections[$id]['conn'])) {
return $this->connections[$id]['conn'];
} else {
try {
// for mysql you need to supply user/pass as well
$conn = new PDO($dsn);
// Tell PDO to throw an exception on error
// (like "MySQL server has gone away")
$conn->setAttribute(
PDO::ATTR_ERRMODE,
PDO::ERRMODE_EXCEPTION
);
$this->connections[$id]['conn'] = $conn;
return $conn;
} catch (PDOException $e) {
return false;
}
}
}
function close($id) {
if (!isset($this->connections[$id])) {
throw new Exception('Invalid DB connection requested');
}
$this->connections[$id]['conn'] = null;
}
}
class Crawler {
private $dbPool;
function __construct(DbPool $dbPool) {
$this->dbPool = $dbPool;
}
function crawl() {
// craw and store data in $crawledData variable
$this->save($crawledData);
}
function saveData($crawledData) {
if (!$conn = $this->dbPool->getConnection('write_conn') {
// doh! couldn't retrieve DB connection ... handle it
} else {
try {
// perform query on the $conn database connection
} catch (Exception $e) {
$msg = $e->getMessage();
if (strstr($msg, 'MySQL server has gone away') {
$this->dbPool->close('write_conn');
$this->saveData($val);
} else {
// some other error occurred
}
}
}
}
}
以上是 解决“ MySQL服务器已消失”错误 的全部内容, 来源链接: utcz.com/qa/405315.html