我使用php函数返回超过1000个网站的状态(即网站上或下)。
public function curlCheck($nodes) {
$results = array();
$node_count = count($nodes);
$curl_arr = array();
$master = curl_multi_init();
for ($i = 0; $i < $node_count; $i++) {
$url = $nodes[$i];
$curl_arr[$i] = curl_init($url);
curl_setopt($curl_arr[$i], CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl_arr[$i], CURLOPT_NOBODY, true);
curl_setopt($curl_arr[$i], CURLOPT_TIMEOUT, 5);
curl_multi_add_handle($master, $curl_arr[$i]);
}
$running = null;
do {
curl_multi_exec($master, $running);
} while ($running > 0);
for ($i = 0; $i < $node_count; $i++) {
$results[$i]['url'] = curl_getinfo($curl_arr[$i], CURLINFO_EFFECTIVE_URL);
$results[$i]['code'] = curl_getinfo($curl_arr[$i], CURLINFO_HTTP_CODE);
$results[$i]['time'] = curl_getinfo($curl_arr[$i], CURLINFO_PRETRANSFER_TIME);
}
echo 'done';
return $results;
}
$nodes = array('http://google.com','http://yahoo.com','http://msn.com');
$result= curlCheck($nodes);
print_r($result);
虽然我使用curl_multi
,但这个过程的时间很长;如何为此目的进行并行处理。
答案 0 :(得分:0)
根据https://bugs.php.net/bug.php?id=61141:
在使用libcurl版本7.24或更高版本(似乎对应于PHP 5.3.10或更高版本)的Windows安装程序中,您可能会发现curl_multi_select()始终返回-1,导致文档中的示例代码超时。这显然不是严格意义上的错误:根据libcurl文档,如果curl_multi_select返回-1,则应该添加自己的睡眠。
答案 1 :(得分:-1)
试试这个解决方案:
如果使用xampp或wampp,请使用set_time_limit(0);
;你的执行时间可能会突然结束;
class myclass
{
public $multi_exec_curl_files = array();
//...
public function name()
{
//add urls to list
foreach($array as $id => $value)
$this->multi_exec_curl_files[] = array('link' => $value['link']);
//...
$this->multiCurl($this->multi_exec_curl_files);
...
}
public function multiCurl($res = array(), $options = "") {
if (count($res) <= 0)
return False;
$handles = array();
if (!$options) // add default options
$options = self::$options;
//print_r($options);
// add curl options to each handle
foreach ($res as $k => $row) {
$ch{$k} = curl_init();
$options[CURLOPT_URL] = $row['link'];
//echo $row['link'].PHP_EOL;
curl_setopt_array($ch{$k}, $options);
$handles[$k] = $ch{$k};
}
//die('d');
$mh = curl_multi_init();
foreach ($handles as $k => $handle) {
curl_multi_add_handle($mh, $handle);
}
$running_handles = null;
//execute the handles
do {
$status_cme = curl_multi_exec($mh, $running_handles);
} while ($status_cme == CURLM_CALL_MULTI_PERFORM);
//
while ($running_handles && $status_cme == CURLM_OK) {
if (curl_multi_select($mh) != -1) {
do {
$status = curl_multi_exec($mh, $running_handles);
} while ($status == CURLM_CALL_MULTI_PERFORM);
}
}
}
从这里拿走;这个工作,我每天测试;根据需要添加功能;
指南:
实例化类,区分大小写
$ app = new myclass();
运行主要功能
$ APP-&GT;名称();
在此功能中,您必须执行查询并从数据库中提取所有网站网址并将链接存储在变量/属性$this->multi_exec_curl_files
中;
我使用$array
作为我的网站列表;
加载完所有网站网址后,请调用多卷曲方法;
$这 - &GT; multiCurl($这 - &GT; multi_exec_curl_files);
这将开始为每个网站提供一个执行行(句柄),它将按照你告诉它做的事情开始;
我使用此方法同时下载多个网站网页,您可以使用此方法查看网站是否在线(多个网站);
$handles
是curl
$handle
是个网址
一旦进程启动,它将等待所有句柄完成;