当前位置:  编程技术>php
本页文章导读:
    ▪php 多线程抓取网页的代码分享      在php中,可以使用Curl完成各种传送文件的操作,比如模拟浏览器发送GET,POST请求等。 php语言本身并不支持多线程,所以开发爬虫程序效率并不高,因此借助Curl Multi Functions 来实现并发多线.........
    ▪php多线程(不使用fork)实例分享      本节分享下,php多线程的几个例子,不使用fork或进程 以下代码实现:检查正在运行的n台服务器,以确定它们正常运转。 <?php $hosts = array("host1.x.com", "host2.x.com", "host3.x.com"); $timeout = 15; $s.........
    ▪php文件下载类(支持多种文件类型)      在php实现的文件下载类或方法中,可以分为普通文件下载和特殊文件(如:PHP文件、HTML文件、图片等)下载。 对于普通的文件下载,只需要写一个链接指向该文件即可,比如:<a href="./filen.........

[1]php 多线程抓取网页的代码分享
    来源: 互联网  发布时间: 2013-12-24

在php中,可以使用Curl完成各种传送文件的操作,比如模拟浏览器发送GET,POST请求等。
php语言本身并不支持多线程,所以开发爬虫程序效率并不高,因此借助Curl Multi Functions 来实现并发多线程的访问多个url地址。

有关curl的基础内容,可以参考如下的文章:
php curl应用实例分析
php curl用法的实例代码
php curl 学习总结
 

本节介绍使用 Curl Multi Functions 并发多线程下载文件的例子。

例1,获取内容直接写入文件

<?php
/**
* 多线程抓取网页内容
* edit by www.
*/
$urls = array(   
 'http://www.sina.com.cn/',   
 'http://www.sohu.com/',   
 'http://www./' 
); //要抓取的页面URL   
     
$save_to='/test.txt';   //抓取内容的写入文件    
   
$st = fopen($save_to,"a");   
$mh = curl_multi_init();    
   
foreach ($urls as $i => $url) {   
  $conn[$i] = curl_init($url);   
  curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");   
  curl_setopt($conn[$i], CURLOPT_HEADER ,0);   
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);   
  curl_setopt($conn[$i], CURLOPT_FILE,$st); //将爬取的代码写入文件   
  curl_multi_add_handle ($mh,$conn[$i]);   
} // 初始化   
     
do {   
  curl_multi_exec($mh,$active);   
} while ($active);  // 执行   
     
foreach ($urls as $i => $url) {   
  curl_multi_remove_handle($mh,$conn[$i]);   
  curl_close($conn[$i]);   
} // 结束清理   
     
curl_multi_close($mh);   
fclose($st); 
?>

例2,获取内容放入变量中,然后写入某个文件
 

<?php
$urls = array(   
 'http://www.sina.com.cn/',   
 'http://www.sohu.com/',   
 'http://www./' 
);   
   
$save_to='/test.txt';   //写入该文件   
$st = fopen($save_to,"a");   
   
$mh = curl_multi_init();   
foreach ($urls as $i => $url) {   
  $conn[$i] = curl_init($url);   
  curl_setopt($conn[$i], CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)");   
  curl_setopt($conn[$i], CURLOPT_HEADER ,0);   
  curl_setopt($conn[$i], CURLOPT_CONNECTTIMEOUT,60);   
  curl_setopt($conn[$i],CURLOPT_RETURNTRANSFER,true);  // 设置将爬取代码转化为字符串,不输出至浏览器   
  curl_multi_add_handle ($mh,$conn[$i]);   
}   
   
do {   
  curl_multi_exec($mh,$active);   
} while ($active);   
     
foreach ($urls as $i => $url) {   
  $data = curl_multi_getcontent($conn[$i]); // 获得爬取的代码字符串   
  fwrite($st,$data);  // 将字符串写入文件。存入数据库也是可以的。   
} // 获得数据变量,并写入文件   
   
foreach ($urls as $i => $url) {   
  curl_multi_remove_handle($mh,$conn[$i]);   
  curl_close($conn[$i]);   
}   
   
curl_multi_close($mh);   
fclose($st);  
?>

    
[2]php多线程(不使用fork)实例分享
    来源: 互联网  发布时间: 2013-12-24

本节分享下,php多线程的几个例子,不使用fork或进程

以下代码实现:检查正在运行的n台服务器,以确定它们正常运转。

<?php
$hosts = array("host1.x.com", "host2.x.com", "host3.x.com");
$timeout = 15;
$status = array();
foreach ($hosts as $host) {
$errno = 0;
$errstr = "";
$s = fsockopen($host, 80, $errno, $errstr, $timeout);
if ($s) {
   $status[$host] = "Connectedn";
   fwrite($s, "HEAD / HTTP/1.0rnHost: $hostrnrn");
   do {
    $data = fread($s, 8192);
    if (strlen($data) == 0) {
    break;
    }
    $status[$host] .= $data;
   } while (true);
   fclose($s);
} else {
   $status[$host] = "Connection failed: $errno $errstrn";
}
} //by www.
print_r($status);
?>

以上代码在fsockopen()分析完hostname且建立一个成功的连接(或延时$timeout秒)之前,扩充这段代码来管理大量服务器将耗费很长时间。
放弃这段代码;可以建立异步连接-不需要等待fsockopen返回连接状态。
PHP仍然需要解析hostname(所以直接使用ip更加明智),不过将在打开一个连接之后立刻返回,继而就可以连接下一台服务器。

有两种方法可以实现;
1,PHP5中可以使用新增的stream_socket_client()函数直接替换掉fsocketopen()。
2,PHP5之前的版本,需要自己动手,用sockets进行扩展。

例子,PHP5中的解决方法:

<?php
$hosts = array("host1.x.com", "host2.x.com", "host3.x.com");
$timeout = 15;
$status = array();
$sockets = array();
/* Initiate connections to all the hosts simultaneously */
foreach ($hosts as $id => $host) {
$s = stream_socket_client("$host:80", $errno, $errstr, $timeout,
   STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
if ($s) {
   $sockets[$id] = $s;
   $status[$id] = "in progress";
} else {
   $status[$id] = "failed, $errno $errstr";
}
}
/* Now, wait for the results to come back in */
while (count($sockets)) {
$read = $write = $sockets;
/* This is the magic function - explained below */
$n = stream_select($read, $write, $e = null, $timeout);
if ($n > 0) {
   /* readable sockets either have data for us, or are failed
   * connection attempts */
   foreach ($read as $r) {
      $id = array_search($r, $sockets);
      $data = fread($r, 8192);
      if (strlen($data) == 0) {
    if ($status[$id] == "in progress") {
     $status[$id] = "failed to connect";
    }
    fclose($r);
    unset($sockets[$id]);
      } else {
    $status[$id] .= $data;
      }
   }
   /* writeable sockets can accept an HTTP request */
   foreach ($write as $w) {
    $id = array_search($w, $sockets);
    fwrite($w, "HEAD / HTTP/1.0rnHost: "
     . $hosts[$id] . "rnrn");
    $status[$id] = "waiting for response";
   }
} else {
   /* timed out waiting; assume that all hosts associated
   * with $sockets are faulty */
   foreach ($sockets as $id => $s) {
    $status[$id] = "timed out " . $status[$id];
   }
   break;
} //by www.
}
foreach ($hosts as $id => $host) {
echo "Host: $hostn";
echo "Status: " . $status[$id] . "nn";
}
?>

用stream_select()等待sockets打开的连接事件。
stream_select()调用系统的select(2)函数来工作:
前面三个参数是你要使用的streams的数组;
可以对其读取,写入和获取异常(分别针对三个参数)。
stream_select()可以通过设置$timeout(秒)参数来等待事件发生-事件发生时,相应的sockets数据将写入你传入的参数。


    
[3]php文件下载类(支持多种文件类型)
    来源: 互联网  发布时间: 2013-12-24

在php实现的文件下载类或方法中,可以分为普通文件下载和特殊文件(如:PHP文件、HTML文件、图片等)下载。

对于普通的文件下载,只需要写一个链接指向该文件即可,比如:<a href="/blog_article/filename.rar">filename.rar</a>。

但对于安全性要求比较高的文件,比较常见的处理办法是写一个函数或一个类来处理文件下载操作以及下载前的一些准备工作。

本文分享的这个这个PHP文件下载类可以支持多种文件类型,可以下载PHP、HTML等文件,也可以在下载gif、jpg、png等图片文件时弹出下载对话框。

先来看下调用方法:

<?php
/**
* 文件下载类
* edit by www.
*/

//调用方法1:
require_once 'download.class.php';
$down = new download('./path/filename.html','downname.html');
//调用方法2:
require_once 'download.class.php';
$down = new download();
$down->is_attachment = true; //以下载对话框的形式打开
$down->download('../images/imagename.jpg','imagename.jpg');
?>

附,php文件下载类源码。


    
最新技术文章:
▪PHP函数microtime()时间戳的定义与用法
▪PHP单一入口之apache配置内容
▪PHP数组排序方法总结(收藏)
▪php数组排序方法大全(脚本学堂整理奉献)
▪php数组排序的几个函数(附实例)
▪php二维数组排序(实例)
▪php根据键值对二维数组排序的小例子
▪php验证码(附截图)
▪php数组长度的获取方法(三个实例)
▪php获取数组长度的方法举例
▪判断php数组维度(php数组长度)的方法
▪php获取图片的exif信息的示例代码
▪PHP 数组key长度对性能的影响实例分析
▪php函数指定默认值的方法示例
▪php提交表单到当前页面、提交表单后页面重定...
▪php四舍五入的三种实现方法
▪php获得数组长度(元素个数)的方法
▪php日期函数的简单示例代码
▪php数学函数的简单示例代码
▪php字符串函数的简单示例代码
▪php文件下载代码(多浏览器兼容、支持中文文...
▪php实现文件下载、支持中文文件名的示例代码...
▪php文件下载(防止中文文件名乱码)的示例代码
▪解决PHP文件下载时中文文件名乱码的问题
▪php数组去重(一维、二维数组去重)的简单示例
▪php小数点后取两位的三种实现方法
▪php Redis 队列服务的简单示例
▪PHP导出excel时数字变为科学计数的解决方法
▪PHP数组根据值获取Key的简单示例
▪php数组去重的函数代码示例
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3