代码:<?
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)问题是浏览器还在工作状态,而网卡显示没有数据传输,一直在读某一页,却得不到结果怎样跳过这个页面?继续后面的操作和程序?

解决方案 »

  1.   

    改用noblock的socket就可以自己控制时间了。
      

  2.   

    解决了!!!!!!<?
    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;
    }
    }
    */
    ?>
      

  3.   

    解决了!!!!!!<?
    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;
    }
    }
    */
    ?>
      

  4.   

    循环外
    $start_time = time();
    循环内
    if (time()-$start_time > 1)
    {
    $str = "";
    echo "timeout!!!";
    break;
    }
    那么循环至多执行1秒,时间不够吧?
      

  5.   

    这个应该是正确的,跑了n次,都没问题!百度看到一定要哭了:)<?
    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>");
    }
    }
    ?>
      

  6.   

    朋友,请关注一下此帖:
    http://community.csdn.net/Expert/topic/4338/4338855.xml?temp=.8305628