以不同的时间间隔从主脚本运行多个PHP脚本
有几个自定义的PHP脚本,我正在从我的浏览器运行,这些脚本将刮取任何给定的URL,并以浏览器中的表格或excel文件的形式返回数据。(可选) 问题是,每当我向脚本添加3个以上的URL时,我都会遇到网络连接错误(由对等方重置连接),这可能是由多种原因造成的。 然后,如果数据由表返回,则结果将被截断,如果由Excel文件返回,则下载文件将在特定点“网络错误”停止 我正在本地计算机(XAMPP)上运行脚本,并在多个实时服务器上测试了这些脚本,出现了相同的问题,但是,我注意到,在实时服务器上,连接将持续更长时间。我从主机提供商那里得到一个警告,脚本不应该再在他们的服务器上运行,因为它使用了大量内存(+1GB RAM),并且正在减慢他们的速度。我假设我将在本地主机上恢复测试 问题:以不同的时间间隔从主脚本运行多个PHP脚本,php,web-scraping,Php,Web Scraping,有几个自定义的PHP脚本,我正在从我的浏览器运行,这些脚本将刮取任何给定的URL,并以浏览器中的表格或excel文件的形式返回数据。(可选) 问题是,每当我向脚本添加3个以上的URL时,我都会遇到网络连接错误(由对等方重置连接),这可能是由多种原因造成的。 然后,如果数据由表返回,则结果将被截断,如果由Excel文件返回,则下载文件将在特定点“网络错误”停止 我正在本地计算机(XAMPP)上运行脚本,并在多个实时服务器上测试了这些脚本,出现了相同的问题,但是,我注意到,在实时服务器上,连接将持续
<?php
//to do link
$OutPut_Excel = $_GET['xls'];// 0 web page or 1 output excel
$show_Name = $_GET['show'];// 0 or 1
$urls = "http://www.URL1.com;
http://www.URL2.com;
http://www.URL3.com;
http://www.URL4.com;
http://www.URL5.com;
http://www.URL6.com;
http://www.URL7.com
";
//output excel
if($OutPut_Excel == "1")
{
header("Content-Type: application/vnd.ms-execl;charset=iso-8859-1");
header("Content-Disposition: attachment; filename=data.xls");
header("Pragma: no-cache");
header("Expires: 0");
}
set_time_limit(0);
ini_set('memory_limit', '-1');
ini_set('display_errors',true);
//output html
if($OutPut_Excel == "0")
{
?>
<html>
<head>
title>scraper</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>
<body>
<?php
}
if($OutPut_Excel == "0")
{
if($show_Name)
{
$nametext = '<td>Name</td>';
}
echo "<table border='1'><tr><td>Name</td><td>Code</td>
<td>City</td><td>Address</td><td>E-mail</td><td>Phone/td> <td>Url</td>$nametext</tr>";
标题>刮刀
关于第二个问题,您可以编写一个循环,执行第二个脚本或函数来检索URL。您应该有一个数组,其中包含要刮取的所有链接,并为每个链接运行该函数或脚本,每次运行后休眠60秒。这只是我头脑中的示例代码,未经测试:
$links = array('URL1', 'URL2', ...);
foreach ($link as $l) {
runScraper($l);
sleep(60);
}
runScraper方法可以调用system()或exec()在另一个PHP进程中运行脚本
关于您得到的错误,这可能是由于对服务器的请求过多。在如此短的时间内,您尝试访问的服务器可能会在N个页面请求后阻止您。1 GB内存?您确定正确管理了变量吗?无论如何,php.ini中有一个config参数限制了脚本可以使用的RAM数量,还有一个用于执行时间的参数。我想这就是停止你的脚本的原因。谢谢Naryl,我会看看它。我更改了执行时间和内存限制,但仍然有相同的问题。通过主机服务器可以重置连接。有没有关于逐个运行所有脚本的提示?您可以使用system()
函数来运行每个脚本。它将等待一个脚本完成后再开始执行下一个脚本。@RajaKhoury您的代码中有一个输入错误:title>scraper您缺少title标记的开头。这与错误无关,但您有一个输入错误:)