首页 > 编程技术 > php

php版本交通银行网银支付接口开发示例

发布时间:2016-11-25 16:19

下文是介绍一个php版本交通银行网银支付接口开发例子,希望这个例子能帮助到各位。

概述:网银支付接口 和支付宝接口大体上差不多,主要的区别是 交通银行提供的 接口核心的比如,加密等是通过java实现的。所以,要想办法使php和java能正常的通信,为此。官方也提供了两套实现方法,一个是通过 socket 进行通信,另一个方法是通过 java 桥接。下面演示的是 socket方法:

1. 配置运行环境
1.1  安装java,自行到oracle官网下载 java,然后安装,并配置正确的 环境变量。
1.2  把 测试的证书导入到java 虚拟机;
 keytool " -import -keystore "java虚拟机放置证书的地址" -storepass changeit -alias test_bocommca -file "证书路径" 完成导入。
 例子:keytool" -import -keystore "C:\Program Files\Java\jre1.5\lib\security\cacerts" -storepass changeit -alias test_bocommca -file "C:\socket\cert\test_root.cer"

 1.3  修改配置文件(in/B2CMerchantSocket.xml):
  采用官方提供的测试 商号进行测试时,无需配置,否则要配置。具体看xml文件说明。

1.4  启动 socket 服务
        window:启动  start.bat 及可;
        linux: 启动  ohup  sh.start,sh&     //使当前脚本脱离终端,并在后台运行。

2. 将网银集成到现有的系统:(以mvc的结构进行说明):

2.1  将不变的参数 配置 写入配置文件:

 代码如下 复制代码

 $config['interfaceVersion']  = "1.0.0.0";   #接口版本
  $config['tranType']    =0; #交易类别  0:B:C
  $config['curType']        = 'CNY';           # 交易币种
  $config['notifyType']   =1;         #0=不通知 1=通知 2=抓取
  $config['merURL']   = "http://www.111cn.net /pay/notify";   # 主动通知url
  $config['goodsURL'        = 'http://www.111cn.net /goods/1.html';           #取货url
  $config['jumpSeconds']   =3;        #跳转时间
  $config['payBatchNo']   = '';     #商户批次号
  $config['proxyMerName']   = '';                 #代理商家名字
  $config['proxyMerType']   = '';                 #代理商类型
  $config['proxyMerCredentials']= '';                #代理商家批次号
  $config['netType']     = 0;                 #渠道编号

  //以下是 新接口需要的参数
  $config['socketUrl']         ="tcp://127.0.0.1:8891";  #socket url
  $config['merID']     ='301310063009501';    #商户id 3013100630095012
2.2 Model


/**
 * 交通银行支付类
 */
class Bocom extends CI_Model {
 private $arrReturn=array();
 private $socket;
 public function __construct() {
  parent::__construct ();
  //加载交通银行配置文件
  $this->config->load('bocom');
  $this->socket=$this->config->item('socketUrl');
 }
 /**
  * 支付方法
  *
  * @param unknown $arr_data=array(
  *  'bill_no'=>
  * )
  */
 public  function pay($arr_data){
  //获得表单传过来的数据
  $this->arrReturn['interfaceVersion'] = $this->config->item('interfaceVersion');
  $this->arrReturn['merID']       = $this->config->item('merID'); //商户号为固定
  $this->arrReturn['orderid']  = $arr_data['bill_no'];
  $this->arrReturn['orderDate']  = $arr_data['bill_date'];
  $this->arrReturn['orderTime']  = $arr_data['bill_time'];
  $this->arrReturn['tranType']  = $this->config->item('tranType');
  $this->arrReturn['amount']    = $arr_data['bill_fee'];
  $this->arrReturn['curType']  = $this->config->item('curType');
  $this->arrReturn['orderContent']  = isset($arr_data['bill_title'])?iconv('utf-8','gb2312',$arr_data["bill_title"]): '';   #订单内容
  $this->arrReturn['orderMono']     = isset($arr_data['bill_mono'])? iconv('utf-8','gb2312',$arr_data['bill_mono']):'';     #商家备注
  $this->arrReturn['phdFlag']       = isset($arr_data['phpFlag'])?$arr_data['phpFlag']:'';
  $this->arrReturn['notifyType']    = $this->config->item('notifyType');
  $this->arrReturn['merURL']        = $this->config->item('merURL');
  $this->arrReturn['goodsURL']      = $this->config->item('goodsURL');
  $this->arrReturn['jumpSeconds']   = $this->config->item('jumpSeconds');
  $this->arrReturn['payBatchNo']    = $this->config->item('payBatchNo');
  $this->arrReturn['proxyMerName']  = $this->config->item('proxyMerName');
  $this->arrReturn['proxyMerType']  = $this->config->item('proxyMerType');
  $this->arrReturn['proxyMerCredentials']= $this->config->item('proxyMerCredentials');
  $this->arrReturn['netType']        = $this->config->item('netType');
  //以下参数 不参与签名
  $this->arrReturn['issBankNo']      =isset($arr_data['code_id'])? trim($arr_data['code_id']):'';
  $tranCode = "cb2200_sign";
  $source='';
  $len = count($this->arrReturn)-1;$j=1;
  foreach($this->arrReturn as $v){
   if($j<=$len){
    $source.=$v."|";
   }
   $j++;
  }
  $source= substr($source, 0,strlen($source)-1);
     $fp= stream_socket_client($this->socket,$errno, $errstr, 30);   
     $retMsg="";
     if (!$fp) {
      log_message("info","socket连接失败");
      return false;
     } else
     {
     $in  = "<?xml version='1.0' encoding='gbk2312'?>";
  $in .= "<Message>";
  $in .= "<TranCode>".$tranCode."</TranCode>";
  $in .= "<MsgContent>".$source."</MsgContent>";
  $in .= "</Message>";
  fwrite($fp, $in);
       while (!feof($fp)) {
        $retMsg =$retMsg.fgets($fp, 1024);
       }
       fclose($fp);
     }
    if(false!==$xml_arr=$this->xmlParse($retMsg)){
       if(is_array($xml_arr)){
        foreach($xml_arr as $k=>$v){
         $this->arrReturn[$k]=$v;
        }
       }else{
        return false;
       }
    }else{
      return false;
    }
    return $this->arrReturn;
 }
 
 /**
  * 解析XML
  */
 public function xmlParse($retMsg){
  $arr=array();
  //解析返回xml
  $dom = new DOMDocument;
  $dom->loadXML($retMsg);
  $retCode = $dom->getElementsByTagName('retCode');
  $retCode_value = $retCode->item(0)->nodeValue;
  $errMsg = $dom->getElementsByTagName('errMsg');
  $errMsg_value = $errMsg->item(0)->nodeValue;
  $signMsg = $dom->getElementsByTagName('signMsg');
  $signMsg_value = $signMsg->item(0)->nodeValue;
  $orderUrl = $dom->getElementsByTagName('orderUrl');
  $orderUrl_value = $orderUrl->item(0)->nodeValue;
  $MerchID = $dom->getElementsByTagName('MerchID');
  $merID = $MerchID->item(0)->nodeValue;
  if($retCode_value != "0"){
   log_message("info","交易返回码:".$retCode_value);
   log_message("info","交易错误信息:".$errMsg_value);
            return false;
        }
   $arr['merSignMsg'] = $signMsg_value;
   $arr['merID']      = $merID;
    $arr['orderUrl']   = $orderUrl_value;     
   return $arr;
 }
 /**
  * 交通银行 支付通知
  * @return boolean|unknown
  */
 public function notify(){
  $tranCode = "cb2200_verify";
  if(!isset($_REQUEST['notifyMsg'])){
   log_message("error","网银支付通知·非法请求");
   return false;
  }
     $notifyMsg = $_REQUEST["notifyMsg"];
  log_message("error",$notifyMsg."回调....");
  
  $lastIndex = strripos($notifyMsg,"|");
  $signMsg = substr($notifyMsg,$lastIndex+1); //签名信息
  $srcMsg = substr($notifyMsg,0,$lastIndex+1);//原文
  $merID = $this->config->item('merID');
  $fp = stream_socket_client($this->socket, $errno, $errstr, 30);
  $retMsg="";
  //
  if (!$fp) {
   echo "$errstr ($errno)<br />\n";
   log_message("error","$errstr ($errno)<br />\n");
  } else{  
   $in  = "<?xml version='1.0' encoding='gb2312'?>";
   $in .= "<Message>";
   $in .= "<TranCode>".$tranCode."</TranCode>";
   $in .= "<merchantID>".$merID."</merchantID>";
   $in .= "<MsgContent>".$notifyMsg."</MsgContent>";
   $in .= "</Message>";
  fwrite($fp, $in);
    while (!feof($fp)) {
     $retMsg =$retMsg.fgets($fp, 1024); 
    }
    fclose($fp);
  }
  //解析返回xml
  $dom = new DOMDocument;
  $dom->loadXML($retMsg); 
  $retCode = $dom->getElementsByTagName('retCode');
  $retCode_value = $retCode->item(0)->nodeValue;
  $errMsg = $dom->getElementsByTagName('errMsg');
  $errMsg_value = $errMsg->item(0)->nodeValue;
  if($retCode_value != '0')
  {
   log_message("error","交易错误信息:" .$errMsg_value."<br>");
   return false;
  }else{
   $arr = preg_split("/\|{1,}/",$srcMsg);
   if($arr[9]=="1"){
    return $this->updateBill($arr[1]);
   }
   log_message("error","交易失败:".$arr[13]."<br/>");
   return false;
  } 
 }
 private function updateBill($billNo){
  // 更新 订单状态
 }
 //end class
}
2.3 控制器
$this->load->model("Bocom");
 支付方法:
 $this->arrData =$this->Bocom->pay($this->data);
 通知:
   $this->arrData =$this->Bocom->notify();

memcached是一个超高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载了,现在我们就来看看如何配置memcached吧,希望能帮助到大家。

memcached的基本命令(安装、卸载、启动、配置相关)

-p 监听的端口
-l 连接的IP地址, 默认是本机
-d start 启动memcached服务
-d restart 重起memcached服务
-d stop|shutdown 关闭正在运行的memcached服务
-d install 安装memcached服务
-d uninstall 卸载memcached服务
-u 以的身份运行 (仅在以root运行的时候有效)
-m 最大内存使用,单位MB。默认64MB

-M 内存耗尽时返回错误,而不是删除项
-c 最大同时连接数,默认是1024
-f 块大小增长因子,默认是1.25
-n 最小分配空间,key+value+flags默认是48
-h 显示帮助

memcached的基本命令(memcached 启动后 用于对memcached管理的数据和本身运行状态相关的命令)

Command Description Example
get Reads a value get mykey
set Set a key unconditionally set mykey 0 60 5
add Add a new key add newkey 0 60 5
replace Overwrite existing key replace key 0 60 5
append Append data to existing key append key 0 60 15
prepend Prepend data to existing key prepend key 0 60 15
incr Increments numerical key value by given number incr mykey 2
decr Decrements numerical key value by given number decr mykey 5
delete Deletes an existing key delete mykey
flush_all Invalidate specific items immediately flush_all
Invalidate all items in n seconds flush_all 900
stats Prints general statistics stats
Prints memory statistics stats slabs
Prints memory statistics stats malloc
Print higher level allocation statistics stats items
stats detail
stats sizes
Resets statistics stats reset
version Prints server version. version
verbosity Increases log level verbosity
quit Terminate telnet session quit
对查看的信息的关键字中英文对照表

pid
memcache服务器的进程ID
uptime
服务器已经运行的秒数
time
服务器当前的unix时间戳
version
memcache版本
pointer_size
当前操作系统的指针大小(32位系统一般是32bit)
rusage_user
进程的累计用户时间
rusage_system
进程的累计系统时间
curr_items
服务器当前存储的items数量
total_items
从服务器启动以后存储的items总数量
bytes
当前服务器存储items占用的字节数
curr_connections
当前打开着的连接数
total_connections
从服务器启动以后曾经打开过的连接数
connection_structures
服务器分配的连接构造数
cmd_get
get命令(获取)总请求次数
cmd_set
set命令(保存)总请求次数
get_hits
总命中次数
get_misses
总未命中次数
evictions
为获取空闲内存而删除的items数(分配给memcache的空间用满后需要删除旧的items来得到空间分配给新的items)
bytes_read
总读取字节数(请求字节数)
bytes_written
总发送字节数(结果字节数)
limit_maxbytes
分配给memcache的内存大小(字节)
threads
当前线程数

下面是一段简单的测试代码,代码中对标识符为 'mykey' 的对象数据进行存取操作:

 

 代码如下 复制代码
<?php
// 包含 memcached 类文件
require_once('memcached-client.php');
// 选项设置
$options = array(
'servers' => array('192.168.1.1:11211'), //memcached 服务的地址、端口,可用多个数组元素表示多个 memcached 服务
'debug' => true, //是否打开 debug
'compress_threshold' => 10240, //超过多少字节的数据时进行压缩
'persistant' => false //是否使用持久连接
);
// 创建 memcached 对象实例
$mc = new memcached($options);
// 设置此脚本使用的唯一标识符
$key = 'mykey';
// 往 memcached 中写入对象
$mc->add($key, 'some random strings');
$val = $mc->get($key);
echo "n".str_pad('$mc->add() ', 60, '_')."n";
var_dump($val);
// 替换已写入的对象数据值
$mc->replace($key, array('some'=>'haha', 'array'=>'xxx'));
$val = $mc->get($key);
echo "n".str_pad('$mc->replace() ', 60, '_')."n";
var_dump($val);
// 删除 memcached 中的对象
$mc->delete($key);
$val = $mc->get($key);
echo "n".str_pad('$mc->delete() ', 60, '_')."n";
var_dump($val);
?>

是不是很简单,在实际应用中,通常会把数据库查询的结果集保存到 memcached 中,下次访问时直接从 memcached 中获取,而不再做数据库查询操作,这样可以在很大程度上减轻数据库的负担。通常会将 SQL 语句 md5() 之后的值作为唯一标识符 key。下边是一个利用 memcached 来缓存数据库查询结果集的示例(此代码片段紧接上边的示例代码):

 代码如下 复制代码


<?php
$sql = 'SELECT * FROM users';
$key = md5($sql); //memcached 对象标识符
if ( !($datas = $mc->get($key)) ) {
// 在 memcached 中未获取到缓存数据,则使用数据库查询获取记录集。
echo "n".str_pad('Read datas from MySQL.', 60, '_')."n";
$conn = mysql_connect('localhost', 'test', 'test');
mysql_select_db('test');
$result = mysql_query($sql);
while ($row = mysql_fetch_object($result))
$datas[] = $row;
// 将数据库中获取到的结果集数据保存到 memcached 中,以供下次访问时使用。
$mc->add($key, $datas);
} else {
echo "n".str_pad('Read datas from memcached.', 60, '_')."n";
}
var_dump($datas);
?>

可以看出,使用 memcached 之后,可以减少数据库连接、查询操作,数据库负载下来了,脚本的运行速度也提高了。

好啦,至此memcached基本架设完成了,如果有啥问题或者有啥偶说的不对的欢迎来联系偶

下面整理了php识别中文编码并自动转换为UTF-8几个例子,这些例子非常的不错,希望对各位有帮助。

php自动识别编码,若里面有中文的话,将其转换为UTF-8就最好了,因为中文在Gbk编辑情况情况下,有可能会乱码,这个和客户端和服务端编码都有关系,为了避免乱码,我们可以使用下面的函数将其自动转换为UTF8国际标准编码:

 代码如下 复制代码

<?php
function characet($data){
  if( !empty($data) ){
    $fileType = mb_detect_encoding()($data , array('UTF-8','GBK','LATIN1','BIG5')) ;
    if( $fileType != 'UTF-8'){
      $data = mb_convert_encoding($data ,'utf-8' , $fileType);
    }
  }
  return $data;
}
?>


补充:文件编码转换

 代码如下 复制代码

$temstr=file_get_contents($path);
$encode   = mb_detect_encoding($temstr,"ASCII,UTF-8,CP936,EUC-CN,BIG-5,EUC-TW");   
$temstr=mb_convert_encoding($temstr,   "CP936",   $encode); 

例子

 代码如下 复制代码

<?php  
$f=fopen("test.txt", "wb");  
$text=utf8_encode("a!");  
 
//先用函数utf8_encode将所需写入的数据变成UTF编码格式。  
 
$text="\\xEF\\xBB\\xBF".$text;  
 
//"\\xEF\\xBB\\xBF",这串字符不可缺少,生成的文件将成为UTF-8格式,否则依然是ANSI格式。  
 
fputs($f, $text);  
 
//写入。  
 
fclose($f);  
?>  

这是一款基于jquery Ajax实现文件无刷新上传文件例子,下面我们一起来看看吧,希望例子能帮助到各位同学哦。

PHP + jQuery Ajax文件上传实例。因为看到一些朋友询问如何实现PHP环境下的网页上传功能,自己这几天刚用了jQuery_upload_multiple上传插件,所以在这里把用法给大家说一下。

要实现基于这个插件的上传功能,其实挺简单,需要jquery就行了,另外还有一个上传文件时的PHP程序,费话不多说,先看下面的HTML,也就是带有上传表单,让用户选择上传文件的页面:

 

 代码如下 复制代码
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Easy Ajax FormData Upload Multiple Images</title>
<script type="text/javascript"" width=100% src="/ajaxjs/jquery-1.6.2.min.js"></script><!--此处可引用你实际路径的jquery插件-->
</head>
<body>
<style>
 #feedback{width:1200px;margin:0 auto;}
 #feedback img{float:left;width:300px;height:300px;}
 #ZjmainstaySignaturePicture,#addpicContainer{float:left;width: 100%;}
 #addpicContainer{margin-left:5px;}
 #ZjmainstaySignaturePicture img{width: 535px;}
 #addpicContainer img{float: left;}
 .loading{display:none;background:url("http://f7-preview.awardspace.com/zjmainstay.co.cc/jQueryExample/jquery_upload_image/files/ui-anim_basic_16x16.gif") no-repeat scroll 0 0 transparent;float: left;padding:8px;margin:18px 0 0 18px;}
</style>
<div id="addpicContainer">
 <!-- 利用multiple="multiple"属性实现添加多图功能 -->
 <!-- position: absolute;left: 10px;top: 5px;只针对本用例将input隐至图片底下。-->
 <!-- height:0;width:0;z-index: -1;是为了隐藏input,因为Chrome下不能使用display:none,否则无法添加文件 -->
 <!-- onclick="getElementById('inputfile').click()" 点击图片时则点击添加文件按钮 -->
 <img onclick="getElementById('inputfile').click()" style="cursor:pointer;border: 1px solid #AABBCC;" title="点击添加图片" alt="点击添加图片"" width=100% src="http://f7-preview.awardspace.com/zjmainstay.co.cc/jQueryExample/jquery_upload_image/files/addfile.jpg">
 <input type="file" multiple="multiple" id="inputfile" style="height:0;width:0;z-index: -1; position: absolute;left: 10px;top: 5px;"/>
 <span class="loading"></span>
</div>
<div id="feedback"></div><!-- 响应返回数据容器 -->
<script type="text/javascript">
$(document).ready(function(){
 //响应文件添加成功事件
 $("#inputfile").change(function(){
  //创建FormData对象
  var data = new FormData();
  //为FormData对象添加数据
  $.each($('#inputfile')[0].files, function(i, file) {
   data.append('upload_file'+i, file);
  });
  $(".loading").show(); //显示加载图片
  //发送数据
  $.ajax({
   url:'submit_form_process.php',
   type:'POST',
   data:data,
   cache: false,
   contentType: false, //不可缺参数
   processData: false,  //不可缺参数
   success:function(data){
    data = $(data).html();
    //第一个feedback数据直接append,其他的用before第1个( .eq(0).before() )放至最前面。
    //data.replace(/&lt;/g,'<').replace(/&gt;/g,'>') 转换html标签,否则图片无法显示。
    if($("#feedback").children('img').length == 0) $("#feedback").append(data.replace(/&lt;/g,'<').replace(/&gt;/g,'>'));
    else $("#feedback").children('img').eq(0).before(data.replace(/&lt;/g,'<').replace(/&gt;/g,'>'));
    $(".loading").hide(); //加载成功移除加载图片
   },
   error:function(){
    alert('上传出错');
    $(".loading").hide(); //加载失败移除加载图片
   }
  });
 });
});
</script>
</body>
</html>

接下来是上传图片的PHP文件代码:文件名:submit_form_process.php

 代码如下 复制代码

<?php
header('content-type:text/html charset:utf-8');
$dir_base = "./files/"; //文件上传根目录
//没有成功上传文件,报错并退出。
if(empty($_FILES)) {
 echo "<textarea><img" width=100% src='{$dir_base}error.jpg'/></textarea>";
 exit(0);
}
$output = "<textarea>";
$index = 0; //$_FILES 以文件name为数组下标,不适用foreach($_FILES as $index=>$file)
foreach($_FILES as $file){
 $upload_file_name = 'upload_file' . $index;//对应index.html FomData中的文件命名
 $filename = $_FILES[$upload_file_name]['name'];
 $gb_filename = iconv('utf-8','gb2312',$filename); //名字转换成gb2312处理
 //文件不存在才上传
 if(!file_exists($dir_base.$gb_filename)) {
  $isMoved = false;  //默认上传失败
  $MAXIMUM_FILESIZE = 1 * 1024 * 1024;  //文件大小限制 1M = 1 * 1024 * 1024 B;
  $rEFileTypes = "/^\.(jpg|jpeg|gif|png){1}$/i";
  if ($_FILES[$upload_file_name]['size'] <= $MAXIMUM_FILESIZE &&
   preg_match($rEFileTypes, strrchr($gb_filename, '.'))) { 
   $isMoved = @move_uploaded_file ( $_FILES[$upload_file_name]['tmp_name'], $dir_base.$gb_filename);  //上传文件
  }
 }else{
  $isMoved = true;//已存在文件设置为上传成功
 }
 if($isMoved){
  //输出图片文件<img>标签
  //注:在一些系统src可能需要urlencode处理,发现图片无法显示,
  //    请尝试 urlencode($gb_filename) 或 urlencode($filename),不行请查看HTML中显示的src并酌情解决。
  $output .= "<img" width=100% src='{$dir_base}{$filename}' title='{$filename}' alt='{$filename}'/>";
 }else {
  $output .= "<img" width=100% src='{$dir_base}error.jpg' title='{$filename}' alt='{$filename}'/>";
 }
 $index++;
}
echo $output."</textarea>";

下面来看一个php模仿百度spider蜘蛛爬虫程序例子了,这个代码写得比较高级了我就不分析了,大家有需要的可以进入参考一下吧。

自己用PHP写了个爬虫,基本功能已经实现

linux 环境下运行#php spider.php http://www.111cn.net

下面为测试过程图

php模仿百度spider蜘蛛爬虫程序例子
下面为测试结果
php模仿百度spider蜘蛛爬虫程序例子
有兴趣的可以试试
脚本缺点:
1.未对静态页面进行去重处理
2.未对页面内js操作后的结果进行处理

 

 代码如下 复制代码

<?php

#加载页面
function curl_get($url){
        $ch=curl_init();
        curl_setopt($ch,CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch,CURLOPT_HEADER,1);
        $result=curl_exec($ch);
        $code=curl_getinfo($ch,CURLINFO_HTTP_CODE);
 if($code!='404' && $result){
  return $result;
 }
        curl_close($ch);
}

#获取页面url链接
function get_page_urls($spider_page_result,$base_url){
  $get_url_result=preg_match_all("/<[a|A].*?href=[\'\"]{0,1}([^>\'\"\ ]*).*?>/",$spider_page_result,$out);
  if($get_url_result){
   return $out[1];
  }else{
   return;
  }
}

#相对路径转绝对路径
function xdtojd($base_url,$url_list){
 if(is_array($url_list)){
  foreach($url_list as $url_item){
   if(preg_match("/^(http:\/\/|https:\/\/|javascript:)/",$url_item)){
    $result_url_list[]=$url_item;
   }else {
    if(preg_match("/^\//",$url_item)){
     $real_url = $base_url.$url_item;
    }else{
     $real_url = $base_url."/".$url_item;
    }
    #$real_url = 'http://www.sumpay.cn/'.$url_item; 
                  $result_url_list[] = $real_url; 
   }
  }
  return $result_url_list;
 }else{
  return;
 }
}

#删除其他站点url
function other_site_url_del($jd_url_list,$url_base){
 
 if(is_array($jd_url_list)){
  foreach($jd_url_list as $all_url){
   echo $all_url;
   if(strpos($all_url,$url_base)===0){
    $all_url_list[]=$all_url;
   }
 

  }
  return $all_url_list;
 }else{
  return;
 }

}

#删除相同URL
function url_same_del($array_url){
 
 if(is_array($array_url)){
  $insert_url=array();
  $pizza=file_get_contents("/tmp/url.txt");
                if($pizza){
   $pizza=explode("\r\n",$pizza);
   foreach($array_url as $array_value_url){
    if(!in_array($array_value_url,$pizza)){
     $insert_url[]=$array_value_url;
    }
   }
   if($insert_url){
                                foreach($insert_url as $key => $insert_url_value){
                                        #这里只做了参数相同去重处理
     $update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
                                        foreach($pizza as $pizza_value){
                                         $update_pizza_value=preg_replace('/=[^&]*/','=leesec',$pizza_value);
                                                if($update_insert_url==$update_pizza_value){
                                                 unset($insert_url[$key]);
                                                        continue;
                                                }

                                        }

    }
   }
 
  }else{
   $insert_url=array();
   $insert_new_url=array();
   $insert_url=$array_url;
   foreach($insert_url as $insert_url_value){
    $update_insert_url=preg_replace('/=[^&]*/','=leesec',$insert_url_value);
    $insert_new_url[]=$update_insert_url;  
   }
   $insert_new_url=array_unique($insert_new_url);
   foreach($insert_new_url as $key => $insert_new_url_val){
    $insert_url_bf[]=$insert_url[$key];
   }
   $insert_url=$insert_url_bf;
  }
  return $insert_url;
 }else{
  return;
 }
}

$current_url=$argv[1];
$fp_puts = fopen("/tmp/url.txt","ab");//记录url列表 
$fp_gets = fopen("/tmp/url.txt","r");//保存url列表 
$url_base_url=parse_url($current_url);
if($url_base_url['scheme']==""){
 $url_base="http://".$url_base_url['host'];
}else{
 $url_base=$url_base_url['scheme']."://".$url_base_url['host'];
}

do{
 $spider_page_result=curl_get($current_url);
 #var_dump($spider_page_result);
 $url_list=get_page_urls($spider_page_result,$url_base);
 #var_dump($url_list);
 if(!$url_list){
  continue;
 }
 $jd_url_list=xdtojd($url_base,$url_list);
 #var_dump($jd_url_list);
 $result_url_arr=other_site_url_del($jd_url_list,$url_base);
 var_dump($result_url_arr);
 $result_url_arr=url_same_del($result_url_arr);
 #var_dump($result_url_arr);
 if(is_array($result_url_arr)){ 
     $result_url_arr=array_unique($result_url_arr);
            foreach($result_url_arr as $new_url) { 
                fputs($fp_puts,$new_url."\r\n"); 
            }
 } 
 
}

while ($current_url = fgets($fp_gets,1024));//不断获得url 
preg_match_all("/<a[^>]+href=[\"']([^\"']+)[\"'][^>]+>/",$spider_page_result,$out);
# echo a href
#var_dump($out[1]);

?>

标签:[!--infotagslink--]

您可能感兴趣的文章: