Php 为什么curl\u multi不能在本地主机中正常工作?
我使用一个php函数返回1000多个网站的状态(即网站是向上还是向下)Php 为什么curl\u multi不能在本地主机中正常工作?,php,curl-multi,Php,Curl Multi,我使用一个php函数返回1000多个网站的状态(即网站是向上还是向下) 公共函数卷发检查($nodes){ $results=array(); $node_count=计数($nodes); $curl_arr=array(); $master=curl_multi_init(); 对于($i=0;$i0); 对于($i=0;$i$value的数组) $this->multi_exec_curl_files[]=array('link'=>$value['link']); //... $this
公共函数卷发检查($nodes){
$results=array();
$node_count=计数($nodes);
$curl_arr=array();
$master=curl_multi_init();
对于($i=0;$i<$node_count;$i++){
$url=$nodes[$i];
$curl\u arr[$i]=curl\u init($url);
curl_setopt($curl_arr[$i],CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl_arr[$i],curl_NOBODY,true);
curl_setopt($curl_arr[$i],CURLOPT_超时,5);
curl_multi_add_句柄($master,$curl_arr[$i]);
}
$running=null;
做{
curl_multi_exec($master,$running);
}而($running>0);
对于($i=0;$i<$node_count;$i++){
$results[$i]['url']=curl\u getinfo($curl\u arr[$i],CURLINFO\u EFFECTIVE\u url);
$results[$i]['code']=curl\u getinfo($curl\u arr[$i],CURLINFO\u HTTP\u code);
$results[$i]['time']=curl\u getinfo($curl\u arr[$i],CURLINFO\u PRETRANSFER\u time);
}
回音“完成”;
返回$results;
}
$nodes=数组('http://google.com','http://yahoo.com','http://msn.com');
$result=curlCheck($nodes);
打印(结果);
虽然我使用了curl\u multi
,但是这个过程的时间很长;为此,我如何进行并行处理 试试这个解决方案:
使用设置时间限制(0)代码>如果使用xampp或wampp;你的执行时间可能突然结束
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);
}
}
}
class-myclass
{
public$multi_exec_curl_files=array();
//...
公共函数名()
{
//将URL添加到列表中
foreach($id=>$value的数组)
$this->multi_exec_curl_files[]=array('link'=>$value['link']);
//...
$this->multiCurl($this->multi\u exec\u curl\u文件);
...
}
公共函数multiCurl($res=array(),$options=”“){
如果(计数($res)$row){
$ch{$k}=curl_init();
$options[CURLOPT_URL]=$row['link'];
//echo$row['link'].PHP_EOL;
curl_setopt_数组($ch{$k},$options);
$handles[$k]=$ch{$k};
}
//死亡('d');
$mh=curl_multi_init();
foreach($k=>$handle的句柄){
curl\u multi\u add\u句柄($mh,$handle);
}
$running_handles=null;
//执行句柄
做{
$status\u cme=curl\u multi\u exec($mh,$running\u句柄);
}while($status\u cme==CURLM\u CALL\u MULTI\u PERFORM);
//
while($running_handles&&$status_cme==CURLM_OK){
如果(卷曲多点选择($mh)!=-1){
做{
$status=curl\u multi\u exec($mh,$running\u句柄);
}而($status==CURLM\u CALL\u MULTI\u PERFORM);
}
}
}
从这里开始;这一个工作,我每天测试它;根据需要添加函数
指南:
实例化该类,区分大小写
$app=新的myclass()
运行主功能
$app->name()
在此函数中,您必须执行查询并从数据库中提取所有网站URL,并将链接存储在变量/property$this->multi_exec_curl_文件中
我使用$array
作为我的网站列表
加载所有网站URL后,调用multi-curl方法
$this->multiCurl($this->multi\u exec\u curl\u文件)
这将为每个网站url启动一个执行行(句柄),它将执行您告诉它的操作
我使用此方法同时下载多个网站网页,您可以使用此方法查看一个网站是否在线(多个网站)
$handles
是curl中链接的集合
$handle
是一个url
进程启动后,将等待所有句柄完成;根据:
在使用libcurl版本7.24或更高版本(似乎对应于PHP5.3.10或更高版本)的Windows设置上,您可能会发现curl\u multi\u select()总是返回-1,导致文档中的示例代码超时。这显然不是一个严格意义上的bug:根据libcurl文档,如果curl\u multi\u select返回-1,您应该添加自己的sleep。谢谢您的回复,您能写一个如何使用此类的示例吗?t谢谢你,但我不能使用它!!我有一个错误(超过了30秒的最长执行时间)。我在Windows7上的xampp中测试了它。你能写一个完整的你用过的代码吗?或者发电子邮件到tahmasebi.f[在]gmail.com吗?请。使用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);
}
}
}