我已经在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块中并捕获任何数据库异常,以便您可以适当地处理它们。这在长时间运行和/或守护程序类型的脚本中尤其重要。因此,这是一个非常基本的示例,使用“连接管理器”来控制对数据库连接的访问:
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 } } } } }