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

 更新时间:2016年11月25日 16:19  点击:2070
下文是介绍一个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" 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="点击添加图片" 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 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 src='{$dir_base}{$filename}' title='{$filename}' alt='{$filename}'/>";
 }else {
  $output .= "<img 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--]

相关文章

  • JavaScript判断浏览器及其版本信息

    本篇文章主要分享了通过window.navigator来判断浏览器及其版本信息的实例代码。具有一定的参考价值,下面跟着小编一起来看下吧...2017-01-23
  • php版本银联支付接口开发实例

    支付接口现在有第三方的支付接口也有银行的支付接口了,今天我们来介绍php版本银联支付接口开发实例了,这个我估计可以帮助到不少的朋友的哦。 银联支付,首先要注意二...2016-11-25
  • 一个奇葩的最短的 IE 版本判断JS脚本

    使用 conditional comment 来判断 IE 的版本。嗯,是早早有人提出,但没有认真看代码。昨天刚好在看 CSS3 PIE 的时候看到,觉得是不是不靠谱。今天看到 Paul Irish 也提起,那么,推荐一下吧。这是作者博客上写的:复制代码 代码...2014-05-31
  • vscode搭建STM32开发环境的详细过程

    这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
  • 安卓开发之Intent传递Object与List教程

    下面我们一起来看一篇关于 安卓开发之Intent传递Object与List的例子,希望这个例子能够为各位同学带来帮助。 Intent 不仅可以传单个的值,也可以传对象与数据集合...2016-09-20
  • php微信公众账号开发之五个坑(二)

    这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
  • 如何设计一个安全的API接口详解

    在日常开发中,总会接触到各种接口,前后端数据传输接口,第三方业务平台接口,下面这篇文章主要给大家介绍了关于如何设计一个安全的API接口的相关资料,需要的朋友可以参考下...2021-08-12
  • 微信开发生成带参数的二维码的讲解

    在微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数的二维码”,通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微...2016-05-19
  • C#如何检测操作系统版本

    这篇文章主要为大家详细介绍了C#如何检测操作系统版本的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
  • SpringBoot高版本修改为低版本时测试类报错的解决方案

    这篇文章主要介绍了SpringBoot高版本修改为低版本时测试类报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-18
  • 分享我对JS插件开发的一些感想和心得

    这篇文章主要给大家分享我对JS插件开发的一些感想和心得的相关资料,需要的朋友可以参考下...2016-02-09
  • Chrome插件开发系列一:弹窗终结者开发实战

    从这一节开始,我们将从零开始打造我们的chrome插件工具库,第一节我们将讲一下插件开发的基础知识并构建一个简单但却很实用的插件,在构建之前,我们先简单的了解一下插件以及插件开发的基础知识...2020-10-03
  • 基于jQuery1.9版本如何判断浏览器版本类型

    在jquery.1.9以前的版本,可以使用$.browser很轻松的判断浏览器的类型和版本,但是在1.9中和以后的版本中,$.browser已经被删除,下面就介绍一下如何实现此功能,希望能够给需要的朋友带来帮助...2016-01-14
  • Cocos2d-x UI开发之CCControlColourPicker控件类使用实例

    这篇文章主要介绍了Cocos2d-x UI开发之CCControlColourPicker控件类使用实例,本文代码中包含大量注释来讲解CCControlColourPicker控件类的使用,需要的朋友可以参考下...2020-04-25
  • 永久解决 Intellij idea 报错:Error :java 不支持发行版本5的问题

    这篇文章主要介绍了永久解决 Intellij idea 报错:Error :java 不支持发行版本5的问题,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-02-20
  • 详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现

    这篇文章主要介绍了详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现的相关资料,需要的朋友可以参考下...2017-03-13
  • Java开发SpringBoot集成接口文档实现示例

    这篇文章主要为大家介绍了Java开发SpringBoot如何集成接口文档的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-28
  • Drupal8模块开发之区块和表单教程

    前页我们讲了 Drupal8模块开发之路由、控制器和菜单链接教程 ,现在我们将学习进一步开发Drupal8模块,区块和表单。 上一教程:Drupal8模块开发之路由、控制器和菜单链...2016-11-25
  • 24个ES6方法解决JS实际开发问题(小结)

    这篇文章主要介绍了24个ES6方法解决JS实际开发问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-01
  • Unity3D游戏开发数据持久化PlayerPrefs的用法详解

    在本篇文章里小编给大家整理了关于Unity3D游戏开发之数据持久化PlayerPrefs的使用的相关知识点内容,需要的朋友们参考下。...2020-06-25