2

我有一个棘手的问题。我在一个基本的共享主机上。我使用 curl 和 php 创建了一个很好的抓取脚本。

因为使用 Curl 的多线程并不是真正的多线程,即使是我使用过的最好的 curl 多线程脚本也可以将抓取速度提高 1,5-2,我得出的结论是我需要运行大量的 cron 任务(例如 50)在我的 php 脚本上每分钟与 mysql 表交互,以便为我的客户提供快速的网络抓取。

我的问题是,当同时运行大量 cron 任务时,我得到一个“Mysql 服务器已经消失”。如果我减少 cron 任务的数量,它会继续工作,但总是很慢。

我还尝试了基于浏览器的解决方案,每次完成时都重新加载脚本。它工作得更好但总是同样的问题:当我决定同时运行 10 次脚本时,它开始使 mysql 服务器或 web 服务器过载(我不知道)

为了解决这个问题,我获得了一个 mysql 服务器,我可以在其中设置 my.cnf ...但问题大致相同。

========= 我的问题是:问题出在哪里?桌子尺寸?我需要一个 100MBPS 的大型专用服务器。如果是,您确定它会解决问题吗?它有多快?通过知道我希望提取速度达到每秒大约 100 个 URL(此时,它达到每 15 秒 1 个 URL,非常慢......)

  • 剧本只有一段。它加载所有页面和 preg 匹配或 dom 数据并插入 mysql 数据库。

  • 我提取了大量数据,这就是为什么一个表会快速包含数百万个条目......但是当我删除它们时,它可能会更快一些,但它总是同样的问题:不可能按顺序并行运行大量任务加快进程。

  • 我不认为问题出在我的脚本上。在所有情况下,即使完美优化,我也不会像我想要的那样快。

  • 我通过使用没有otu代理的脚本来进行抓取,但差异非常小..不显着..

我的结论是我需要使用专用服务器,但如果我不确定它是否能解决问题,我不想每月投资 100 美元,我将能够运行这些大量的 cron 任务/调用mysql 数据库没有问题。

4

2 回答 2

0

我将不得不查看代码,但实际上它看起来确实受到主机的速率限制。

是否可以每分钟或两分钟运行一次 cron,但将刮擦批处理到脚本中的一个 SQL 连接上?

本质上,目标是打开一次 sql 套接字并在连接上运行多个 URL 抓取,而不是当前每个 mysql 连接一次抓取,希望避免主机的速率限制。

伪代码:

<?php
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "my_db");
$sql = "SELECT url FROM urls_table WHERE scraped='0' LIMIT 100";
$result = mysqli_query($link, $sql);
while($row = mysqli_fetch_array($result, MYSQLI_NUM)){
    $url_to_scrape = $row[0];
    //TODO: your scrape code goes here
}
//Only AFTER you've scraped multiple URLs do we close the connection
//this will drastically reduce the number of SQL connects and should help
mysqli_close($link);
?>
于 2018-03-11T14:50:11.253 回答
-1

这太容易了……永远不要在同一个 URL 上发送多线程。可能有许多不同的 URL。但尽量遵守一定的超时时间。你可以这样做:

sleep($random);  $random = random(15, 35) ; // in seconds
于 2018-02-24T20:59:34.257 回答