我有个棘手的问题。我在一个基本的共享主机上。我用curl和php创建了一个很好的擦拭脚本。
因为使用Curl的多线程并不是真正的多线程,而且即使是我使用过的最好的curl多线程脚本也会加快1,5-2的抓取速度,因此我得出的结论是,我需要在我的php脚本上运行大量的cron任务(比如每分钟50项),该脚本与mysql表交互,以便为我的客户提供快速的web抓取。
我的问题是,当大量cron任务同时运行时,我会得到一个"Mysql服务器已经消失了“。如果我减少了cron任务的数量,它就会继续工作,但是总是很慢。
我还尝试了一种基于浏览器的解决方案,每次完成后都重新加载脚本。它工作得更好,但问题总是一样:当我决定同时运行10次脚本时,它开始重载mysql服务器或web服务器(我不知道)
为了解决这个问题,我已经获得了一个mysql服务器,在这里我可以设置my.cnf ...but --问题大致保持不变。
========= 我的问题是:问题从何而来?桌子的尺寸?我需要一个100 NEED的专用服务器。如果是的话,你确定它能解决问题吗?它有多快?通过知道我希望提取速度达到每秒大约100个URL (此时,它会达到每15秒一个URL,非常慢.)
我的结论是,我需要使用一台专用服务器,但如果我不确定它是否能解决问题,我不想每月投资100美元,而且我将能够在mysql db上运行大量的cron任务/调用,而不会出现问题。
发布于 2018-03-11 14:50:11
我必须看到代码,但本质上它看起来确实是受主机的限制。
是否有可能每隔一两分钟运行一次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-02-24 20:59:34
太简单了..。不要在同一个URL上发送多线程。可能是许多不同的URL。但要尊重一定的超时时间。你可以这样做:
sleep($random); $random = random(15, 35) ; // in secondshttps://stackoverflow.com/questions/14837210
复制相似问题