代码:<?
error_reporting(E_ALL);
set_time_limit(0); $link = mysql_connect ('localhost', 'root', 'root');
mysql_select_db ('test', $link); $runtimes = 10000; for ($i=0; $i<$runtimes; $i++)
{
f_socket("www.baidu.com","/s?wd=10000" . $i);
f_debug("page number: " . $i . "<br>");
} function f_debug($msg)
{
$datetime = date('Y-m-d G:i:s');
$sql = "INSERT INTO test_debug(msg, datetime) values('$msg', '$datetime')";
$result = mysql_query($sql) or die("SQL: " . $sql . "<br>ERR: " . mysql_error());
} function f_socket($website,$url)
{
$service_port = getservbyname('www', 'tcp');
$address = gethostbyname($website);
f_debug("socket: " . "1" . "<br>");
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$socket_result = socket_connect($socket, $address, $service_port);// or die("SOCKET_CONNECT_ERROR: " . socket_strerror(socket_last_error($socket)));
f_debug("socket: " . "2" . "<br>");
$in = "GET " . $url . " HTTP/1.1\r\n";
$in .= "Host: " . $website . "\r\n";
$in .= "Connection: close\r\n\r\n";
socket_write($socket, $in, strlen($in));
f_debug("socket: " . "3" . "<br>");
$str = "";
do
{
if (false === ($out = socket_read($socket, 4096)))
{
$str = "";
break;
}
$str .= $out;
} while ($out != '');
f_debug("socket: " . "4" . "<br>");
socket_close($socket);
f_debug("socket: " . "5" . "<br>");
return $str;
}
?>数据库:
id msg datetime
666 page number: 0<br> 2005-10-16 17:13:49
667 socket: 1<br> 2005-10-16 17:13:49
668 socket: 2<br> 2005-10-16 17:13:49
669 socket: 3<br> 2005-10-16 17:13:49
670 socket: 4<br> 2005-10-16 17:13:49
671 socket: 5<br> 2005-10-16 17:13:49
672 page number: 1<br> 2005-10-16 17:13:49
673 socket: 1<br> 2005-10-16 17:13:49
674 socket: 2<br> 2005-10-16 17:13:49
675 socket: 3<br> 2005-10-16 17:13:49
676 socket: 4<br> 2005-10-16 17:13:50
677 socket: 5<br> 2005-10-16 17:13:50
678 page number: 2<br> 2005-10-16 17:13:50
679 socket: 1<br> 2005-10-16 17:13:50
680 socket: 2<br> 2005-10-16 17:13:50
681 socket: 3<br> 2005-10-16 17:13:50
682 socket: 4<br> 2005-10-16 17:13:50
683 socket: 5<br> 2005-10-16 17:13:50
684 page number: 3<br> 2005-10-16 17:13:50
685 socket: 1<br> 2005-10-16 17:13:50
686 socket: 2<br> 2005-10-16 17:13:50
687 socket: 3<br> 2005-10-16 17:13:50
688 socket: 4<br> 2005-10-16 17:13:50
689 socket: 5<br> 2005-10-16 17:13:50
690 page number: 4<br> 2005-10-16 17:13:50 ................. 21541 socket: 1<br> 2005-10-16 17:44:27
21542 socket: 2<br> 2005-10-16 17:44:27
21543 socket: 3<br> 2005-10-16 17:44:27
21544 socket: 4<br> 2005-10-16 17:44:27
21545 socket: 5<br> 2005-10-16 17:44:27
21546 page number: 3480<br> 2005-10-16 17:44:27
21547 socket: 1<br> 2005-10-16 17:44:27
21548 socket: 2<br> 2005-10-16 17:44:27
21549 socket: 3<br> 2005-10-16 17:44:27
大家看上面的代码,功能是遍历搜索baidu返回html页面,并将log记录写进数据库, 运行了30分钟就停了,查看test数据库的test_debug表,发现程序停在socket_read($socket, 4096)问题是浏览器还在工作状态,而网卡显示没有数据传输,一直在读某一页,却得不到结果怎样跳过这个页面?继续后面的操作和程序?
error_reporting(E_ALL);
set_time_limit(0); $link = mysql_connect ('localhost', 'root', 'root');
mysql_select_db ('test', $link); $runtimes = 10000; for ($i=0; $i<$runtimes; $i++)
{
f_socket("www.baidu.com","/s?wd=10000" . $i);
f_debug("page number: " . $i . "<br>");
} function f_debug($msg)
{
$datetime = date('Y-m-d G:i:s');
$sql = "INSERT INTO test_debug(msg, datetime) values('$msg', '$datetime')";
$result = mysql_query($sql) or die("SQL: " . $sql . "<br>ERR: " . mysql_error());
} function f_socket($website,$url)
{
$service_port = getservbyname('www', 'tcp');
$address = gethostbyname($website);
f_debug("socket: " . "1" . "<br>");
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$socket_result = socket_connect($socket, $address, $service_port);// or die("SOCKET_CONNECT_ERROR: " . socket_strerror(socket_last_error($socket)));
f_debug("socket: " . "2" . "<br>");
$in = "GET " . $url . " HTTP/1.1\r\n";
$in .= "Host: " . $website . "\r\n";
$in .= "Connection: close\r\n\r\n";
socket_write($socket, $in, strlen($in));
f_debug("socket: " . "3" . "<br>");
$str = "";
do
{
if (false === ($out = socket_read($socket, 4096)))
{
$str = "";
break;
}
$str .= $out;
} while ($out != '');
f_debug("socket: " . "4" . "<br>");
socket_close($socket);
f_debug("socket: " . "5" . "<br>");
return $str;
}
?>数据库:
id msg datetime
666 page number: 0<br> 2005-10-16 17:13:49
667 socket: 1<br> 2005-10-16 17:13:49
668 socket: 2<br> 2005-10-16 17:13:49
669 socket: 3<br> 2005-10-16 17:13:49
670 socket: 4<br> 2005-10-16 17:13:49
671 socket: 5<br> 2005-10-16 17:13:49
672 page number: 1<br> 2005-10-16 17:13:49
673 socket: 1<br> 2005-10-16 17:13:49
674 socket: 2<br> 2005-10-16 17:13:49
675 socket: 3<br> 2005-10-16 17:13:49
676 socket: 4<br> 2005-10-16 17:13:50
677 socket: 5<br> 2005-10-16 17:13:50
678 page number: 2<br> 2005-10-16 17:13:50
679 socket: 1<br> 2005-10-16 17:13:50
680 socket: 2<br> 2005-10-16 17:13:50
681 socket: 3<br> 2005-10-16 17:13:50
682 socket: 4<br> 2005-10-16 17:13:50
683 socket: 5<br> 2005-10-16 17:13:50
684 page number: 3<br> 2005-10-16 17:13:50
685 socket: 1<br> 2005-10-16 17:13:50
686 socket: 2<br> 2005-10-16 17:13:50
687 socket: 3<br> 2005-10-16 17:13:50
688 socket: 4<br> 2005-10-16 17:13:50
689 socket: 5<br> 2005-10-16 17:13:50
690 page number: 4<br> 2005-10-16 17:13:50 ................. 21541 socket: 1<br> 2005-10-16 17:44:27
21542 socket: 2<br> 2005-10-16 17:44:27
21543 socket: 3<br> 2005-10-16 17:44:27
21544 socket: 4<br> 2005-10-16 17:44:27
21545 socket: 5<br> 2005-10-16 17:44:27
21546 page number: 3480<br> 2005-10-16 17:44:27
21547 socket: 1<br> 2005-10-16 17:44:27
21548 socket: 2<br> 2005-10-16 17:44:27
21549 socket: 3<br> 2005-10-16 17:44:27
大家看上面的代码,功能是遍历搜索baidu返回html页面,并将log记录写进数据库, 运行了30分钟就停了,查看test数据库的test_debug表,发现程序停在socket_read($socket, 4096)问题是浏览器还在工作状态,而网卡显示没有数据传输,一直在读某一页,却得不到结果怎样跳过这个页面?继续后面的操作和程序?
error_reporting(E_ALL);
set_time_limit(0);
$runtimes = 100; for ($i=0; $i<$runtimes; $i++)
{
$str = f_socket("www.baidu.com","/s?wd=10000" . $i);
echo "<textarea>" . $str . "</textarea><br>";
} function f_socket($website,$url)
{
$service_port = getservbyname('www', 'tcp');
$address = gethostbyname($website); $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (false == ($socket_result = socket_connect($socket, $address, $service_port)))
{
echo ("SOCKET_CONNECT_ERROR: " . socket_strerror(socket_last_error($socket)));
} $in = "GET " . $url . " HTTP/1.1\r\n";
$in .= "Host: " . $website . "\r\n";
$in .= "Connection: close\r\n\r\n";
socket_write($socket, $in, strlen($in)); $start_time = time();
$str = "";
do
{
if (false === ($out = socket_read($socket, 8192)))
{
echo ("SOCKET_READ_ERROR: " . socket_strerror(socket_last_error($socket)));
$str = "";
break;
}
if (time() - $start_time > 1)
{
echo ("SOCKET_READ_ERROR: Timeout!!!");
$str = "";
break;
}
$str .= $out;
} while ($out != ""); socket_close($socket);
return $str;
}
/*
function f_socket($website,$url)
{
$fp = fsockopen($website, 80, $errno, $errstr, 30);
if (!$fp)
{
}
else
{
$out = "GET " . $url . " HTTP/1.1\r\n";
$out .= "Host: " . $website . "\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$str = "";
$start_time = time();
while (!feof($fp))
{
$str .= fread($fp, 8192);
if (time()-$start_time > 1)
{
$str = "";
echo "timeout!!!";
break;
}
}
return $str;
}
}
*/
?>
error_reporting(E_ALL);
set_time_limit(0);
$runtimes = 100; for ($i=0; $i<$runtimes; $i++)
{
$str = f_socket("www.baidu.com","/s?wd=10000" . $i);
echo "<textarea>" . $str . "</textarea><br>";
} function f_socket($website,$url)
{
$service_port = getservbyname('www', 'tcp');
$address = gethostbyname($website); $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (false == ($socket_result = socket_connect($socket, $address, $service_port)))
{
echo ("SOCKET_CONNECT_ERROR: " . socket_strerror(socket_last_error($socket)));
} $in = "GET " . $url . " HTTP/1.1\r\n";
$in .= "Host: " . $website . "\r\n";
$in .= "Connection: close\r\n\r\n";
socket_write($socket, $in, strlen($in)); $start_time = time();
$str = "";
do
{
if (false === ($out = socket_read($socket, 8192)))
{
echo ("SOCKET_READ_ERROR: " . socket_strerror(socket_last_error($socket)));
$str = "";
break;
}
if (time() - $start_time > 1)
{
echo ("SOCKET_READ_ERROR: Timeout!!!");
$str = "";
break;
}
$str .= $out;
} while ($out != ""); socket_close($socket);
return $str;
}
/*
function f_socket($website,$url)
{
$fp = fsockopen($website, 80, $errno, $errstr, 30);
if (!$fp)
{
}
else
{
$out = "GET " . $url . " HTTP/1.1\r\n";
$out .= "Host: " . $website . "\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$str = "";
$start_time = time();
while (!feof($fp))
{
$str .= fread($fp, 8192);
if (time()-$start_time > 1)
{
$str = "";
echo "timeout!!!";
break;
}
}
return $str;
}
}
*/
?>
$start_time = time();
循环内
if (time()-$start_time > 1)
{
$str = "";
echo "timeout!!!";
break;
}
那么循环至多执行1秒,时间不够吧?
error_reporting(E_ALL);
set_time_limit(0);
$runtimes = 1000; for ($i=0; $i<$runtimes; $i++)
{
$datetime = date('Y-m-d G:i:s');
$str = f_fsock("www.baidu.com","/s?wd=1000" . $i);
echo $i . " " . $datetime . " <textarea>" . $str . "</textarea><br>";
} function f_fsock($website,$url)
{
$fp = fsockopen($website, 80, $errno, $errstr, 30);
if ($fp)
{
$out = "GET " . $url . " HTTP/1.1\r\n";
$out .= "Host: " . $website . "\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
$str = "";
while (!feof($fp))
{
stream_set_timeout($fp, 20);
$str .= fread($fp, 8192);
$info = stream_get_meta_data($fp);
if ($info['timed_out'])
{
$str = "";
echo("SOCKET: " . "Connection timed out! " . "($errno) $errstr" . "<br>");
break;
}
}
fclose($fp);
return $str;
}
else
{
echo("SOCKET: " . "fsockopen error! " . "($errno) $errstr" . "<br>");
}
}
?>
http://community.csdn.net/Expert/topic/4338/4338855.xml?temp=.8305628