php实现通过soap调用.Net的WebService asmx文件
最近,帮一个同行测试用.net写的WebService接口,C#调用通过,现在需要测试一下php版本对它的调用,经过各种探索,相关的PHP调用webservice的过程如下:
1.打开php相关扩展:
找到配置文件php.ini 文件, 打开以下扩展
extension = php_soap.dll
extension = php_curl.dll
extension = php_openssl.dll
2.php代码如下:
代码如下 | 复制代码 |
<?php header("content-type:text/html;charset=utf-8"); $client=newSoapClient(" http://192.168.3.178:8080/ChkWelePsw.asmx?WSDL"); //本行测试不可行 $client = new SoapClient(" http://192.168.3.178:8080/chkwelepsw.asmx?WSDL/ChkWele?username=test3&psw=123"); //参数这样传递 先包装一下 $param=array('username'=>'test3','psw'=>'123'); //调用必须用__soapCall $p=$client->__soapCall('ChkWele',array('parameters'=>$param)); print_r($p->ChkWeleResult);//这里先输出一下变量$p,看看是什么类型。 ?> |
注意,在php调用某个方法后,其soap对象,就会自动产生一个Result方法,以方便显示调用结果,如上面的 被调用端的WebService的 “ChkWele”方法 ,
调用端就有相应的“ChkWeleResult”方法。
.NET部分 webservice要注意的地方
代码如下 | 复制代码 |
/* * <system.web>在这个节点中加入如下内容 <webServices> <protocols> <add name="HttpSoap"/> <add name="HttpPost"/> <add name="HttpGet"/> <add name="Documentation"/> </protocols> </webServices> */ [WebMethod(Description ="This......", EnableSession =false)] publicstringChkWele(stringusername,stringpsw) { stringret =""; returnret; } |
本文介绍了PHP批量修改文件名称的方法分析,非常实用,有兴趣的同学快来看看吧
在这里我们利用一个战地自己写的一个例子来具体分析一下利用PHP批量修改文件名称的思路和注意事项。
从这个例子里你将会看到,PHP如何判断一个路径是不是目录,如何用PHP取得路径中的文件名称和文件的扩展名,随机函数rand的基本应用,以及这个程序的核心内容递归函数的基本应用。
程序功能:利用PHP目录和文件函数遍历用户给出目录的所有的文件和文件夹,修改文件名称;
首先判断用户给出的目录是不是一个合法目录;
我们这里只是修改狭义的文件名称(不包括目录),所以在程序中一定要判断是不是目录,如果是目录我们就打开这个目录——从而实现遍历目录下的所有文件。如果不是我们就用一个随机的名称修改原来的文件名(用随机数做名称其实不科学,但是这不是我们的重点)。
具体的程序如下:
代码如下 | 复制代码 |
<?php //利用PHP目录和文件函数遍历用户给出目录的所有的文件和文件夹,修改文件名称 functionfRename($dirname){ if(!is_dir($dirname)){ echo"{$dirname}不是一个有效的目录!"; exit(); } $handle= opendir($dirname); while(($fn= readdir($handle))!==false){ if($fn!='.'&&$fn!='..'){ $curDir=$dirname.'/'.$fn; if(is_dir($curDir)){ fRename($curDir); } else{ $path=pathinfo($curDir); $newname=$path['dirname'].'/'.rand(0,100).'.'.$path['extension']; rename($curDir,$newname); echo$curDir.'---'.$newname." } } } } //给出一个目录名称调用函数 fRename('pl'); ?> |
程序分析:
第4行我们用is_dir函数来判断用户给出的目录是不是一个有效的目录名称;因为我们是学习所以写的简单一点如果你要放在服务器上供大家使用的话,你一定要谨慎的验证这个输入数据——例如,这个目录是否允许用户修改等等……
注意函数第9行的判断,必须用全等判断(PHP全等符号===三个等号,不全等!==一个叹号两个等号),否则如果有一个文件名称为0(零),会导致程序意外终止;
第12行,如果读取的文件是一个目录,就在此调用函数本身,实现函数的递归;
注意第16行pathinfo函数的用法,这个函数返回一个拥有三个元素的数组三个元素分别是:
Dirname路径的目录名称,basename路径包含的文件名称 和 extension文件的扩展名,具体这个函数的用法请参看手册相关部分。
本文介绍了PHP 中使用ajax时一些常见错误总结整理,非常实用,有兴趣的同学可以看看PHP作为后端时,前端js使用ajax技术进行相互信息传送时,经常会出错误,对于新手来说有些手足无措。总结错误、经验,以后随时回顾。
第一个问题,当前端无错误的情况下,页面调试也显示没有问题,但是ajax获取不到后端php文件发送过来的信息:
前端代码如下:
代码如下 | 复制代码 |
$.ajax({ url:Ƈ.php',//目的php文件 data:{"age":12,"name":'zh'},//传送的数据 type:‘post',//方式post/get dataType:'json',//数据传送格式 success:function(response) { console.log(response); }, error:function(response) { console.log(response); console.log("错误"); } }); |
php后端代码如下:
代码如下 | 复制代码 |
$postAge=$_POST['age']; $postName=$_POST['name']; echo$postAge; echo$postName; |
页面出现后,F12调试查看如下所示:
状态码都没问题,status是200,responseReady是4,说明在html发送给php文件信息过程是没有问题的。而且php也返回了信息。可是为什么程序走了error而没有走success呢?
这时需要小心!由于php后端多个echo没有把数据整理为json格式。也就是说php返回的是一个字符串不是json格式的数据。有人说加上json_encode()呢?这样也是不行的,因为json_encode()的函数作用没搞清,百度仔细看下。json_encode()与json_decode()是一对。
json_encode(json),把json整理为json格式的数据。在上例中,就算php后端代码改写为:echo json_encode(postAge);和echojsonencode(postName);也是不对的。因为这样仅仅是把单个postAge和postName整理为了json格式,但是由于是2个返回,既是2个response,在浏览器调试页面也可以看到1个post回来2个response。这样导致2个json格式的数据返回给前端是就不再是json格式的数据(我理解为json污染,方便理解)。也就是单个数据是json格式但是多个json格式数据“胡乱”结合在一起不按照json格式合并在一起就会产生“污染”。导致整体数据格式混乱无法被识别,这种情况者数据处理和传输时随时都见得到。
json_decode(json,true/false)函数是把json整理为数组或者object(理解为类)。true是强制装换为(关联)数组,false是默认的会转换为object形式的数据。
回到本文提出的例子上。
既然传送回来的数据不再是json格式的数据,那么就是dataType的问题了。
dataType是告诉浏览器检查传送的数据格式。如果不写,浏览器不会去检查数据格式,写了就一定检查而且必须满足格式要求。本例中,由于写了为json格式,但是传回来时不是json格式,所以浏览器认为传输过程中出现了错误,所以走了error而没有走success。
这时最好的方式是修改php代码,将echo的内容改为一个数组,用数组的信形式把整体数据整理为json格式进行传送(json_encode),避免发生错误。
当然也可以使用另一种方法,类似作弊的方法,直接注释掉(或者不写)dataType,这样浏览器就不会去检查数据的形式而是根据数据的形式智能的判断,类似蒙混过关。
以下是dataType的W3school解释:
值得注意的是,后端php文件中多个echo输出后,数据返回确是一起返回的,既是修改正确后,前端得到的数据是2个数据合为一个字符串的形式数据。本例子中得到的数据是12zh。
当然还有很多细节问题了,比如php后端只能用echo或者die(),不能用return,这是因为return是只在服务器端中返回数据使用,而echo是打印数据,将数据从服务器端打印出来,给前端。return只能在服务器端,或者前端单一的返回。而die()的强大就不提了,直接终止后端php程序的形式返回数据。
还有比如在$,ajax({});中每一行既是一个参数,参数之间是逗号隔开,多个数据是在{}内,隔开是用逗号等等。
小编给大家推荐的这篇文章介绍了浅谈PHP的反射API的教程,非常实用,有兴趣的同学快来看看吧PHP的反射API,即在PHP运行状态下,通过分析PHP程序,可以导出对象所属的类,方法,属性,参数等信息。
如何使用反射API
示例代码 Person.php
Person类,包含一个成员变量和三个成员方法
获取$student对象的方法和属性列表
ReflectionClass类报告了一个类的有关信息
输出结果为:name say __set __get
也可以用class函数,获取对象属性的关联数组的信息
通过class()函数获取类的信息
打印结果:
通过这个反射API,可以做hook实现插件功能,动态代理等。
网上找的动态代理示例
小编推荐的这篇文章介绍了Python实现 多进程导入CSV数据到 MySQL的教程,非常实用,有兴趣的同学快来看看吧前段时间帮同事处理了一个把 CSV 数据导入到 MySQL 的需求。两个很大的 CSV 文件, 分别有 3GB、2100 万条记录和 7GB、3500 万条记录。对于这个量级的数据,用简单的单进程/单线程导入 会耗时很久,最终用了多进程的方式来实现。具体过程不赘述,记录一下几个要点:
批量插入而不是逐条插入
为了加快插入速度,先不要建索引
生产者和消费者模型,主进程读文件,多个 worker 进程执行插入
注意控制 worker 的数量,避免对 MySQL 造成太大的压力
注意处理脏数据导致的异常
原始数据是 GBK 编码,所以还要注意转换成 UTF-8
用 click 封装命令行工具
具体的代码实现如下:
代码如下 | 复制代码 |
#!/usr/bin/env python # -*- coding: utf-8 -*-
importcodecs importcsv importlogging importmultiprocessing importos importwarnings
importclick importMySQLdb importsqlalchemy
warnings.filterwarnings('ignore', category=MySQLdb.Warning)
# 批量插入的记录数量 BATCH=5000
DB_URI='mysql://root@localhost:3306/example?charset=utf8'
engine=sqlalchemy.create_engine(DB_URI)
defget_table_cols(table): sql='SELECT * FROM `{table}` LIMIT 0'.format(table=table) res=engine.execute(sql) returnres.keys()
definsert_many(table, cols, rows, cursor): sql='INSERT INTO `{table}` ({cols}) VALUES ({marks})'.format( table=table, cols=', '.join(cols), marks=', '.join(['%s']*len(cols))) cursor.execute(sql,*rows) logging.info('process %s inserted %s rows into table %s', os.getpid(),len(rows), table)
definsert_worker(table, cols, queue): rows=[] # 每个子进程创建自己的 engine 对象 cursor=sqlalchemy.create_engine(DB_URI) whileTrue: row=queue.get() ifrowisNone: ifrows: insert_many(table, cols, rows, cursor) break
rows.append(row) iflen(rows)==BATCH: insert_many(table, cols, rows, cursor) rows=[]
definsert_parallel(table, reader, w=10): cols=get_table_cols(table)
# 数据队列,主进程读文件并往里写数据,worker 进程从队列读数据 # 注意一下控制队列的大小,避免消费太慢导致堆积太多数据,占用过多内存 queue=multiprocessing.Queue(maxsize=w*BATCH*2) workers=[] foriinrange(w): p=multiprocessing.Process(target=insert_worker, args=(table, cols, queue)) p.start() workers.append(p) logging.info('starting # %s worker process, pid: %s...', i+1, p.pid)
dirty_data_file='./{}_dirty_rows.csv'.format(table) xf=open(dirty_data_file,'w') writer=csv.writer(xf, delimiter=reader.dialect.delimiter)
forlineinreader: # 记录并跳过脏数据: 键值数量不一致 iflen(line) !=len(cols): writer.writerow(line) continue
# 把 None 值替换为 'NULL' clean_line=[Noneifx=='NULL'elsexforxinline]
# 往队列里写数据 queue.put(tuple(clean_line)) ifreader.line_num%500000==0: logging.info('put %s tasks into queue.', reader.line_num)
xf.close()
# 给每个 worker 发送任务结束的信号 logging.info('send close signal to worker processes') foriinrange(w): queue.put(None)
forpinworkers: p.join()
defconvert_file_to_utf8(f, rv_file=None): ifnotrv_file: name, ext=os.path.splitext(f) ifisinstance(name,unicode): name=name.encode('utf8') rv_file='{}_utf8{}'.format(name, ext) logging.info('start to process file %s', f) withopen(f) as infd: withopen(rv_file,'w') as outfd: lines=[] loop=0 chunck=200000 first_line=infd.readline().strip(codecs.BOM_UTF8).strip()+'\n' lines.append(first_line) forlineininfd: clean_line=line.decode('gb18030').encode('utf8') clean_line=clean_line.rstrip()+'\n' lines.append(clean_line) iflen(lines)==chunck: outfd.writelines(lines) lines=[] loop+=1 logging.info('processed %s lines.', loop*chunck)
outfd.writelines(lines) logging.info('processed %s lines.', loop*chunck+len(lines))
@click.group() defcli(): logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(name)s - %(message)s')
@cli.command('gbk_to_utf8') @click.argument('f') defconvert_gbk_to_utf8(f): convert_file_to_utf8(f)
@cli.command('load') @click.option('-t','--table', required=True,help='表名') @click.option('-i','--filename', required=True,help='输入文件') @click.option('-w','--workers', default=10,help='worker 数量,默认 10') defload_fac_day_pro_nos_sal_table(table, filename, workers): withopen(filename) as fd: fd.readline() # skip header reader=csv.reader(fd) insert_parallel(table, reader, w=workers)
if__name__=='__main__': cli() |
相关文章
- 下面小编来给大家演示几个php操作zip文件的实例,我们可以读取zip包中指定文件与删除zip包中指定文件,下面来给大这介绍一下。 从zip压缩文件中提取文件 代...2016-11-25
Jupyter Notebook读取csv文件出现的问题及解决
这篇文章主要介绍了JupyterNotebook读取csv文件出现的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2023-01-06- 有时我们接受或下载到的PSD文件打开是空白的,那么我们要如何来解决这个 问题了,下面一聚教程小伙伴就为各位介绍Photoshop打开PSD文件空白解决办法。 1、如我们打开...2016-09-14
- 这篇文章主要介绍了c# 三种方法调用WebService接口的相关资料,文中示例代码非常详细,帮助大家更好的理解和学习,感兴趣的朋友可以了解下...2020-07-07
- 这篇文章主要介绍了解决python 使用openpyxl读写大文件的坑,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-03-13
- 这篇文章主要介绍了C#实现HTTP下载文件的方法,包括了HTTP通信的创建、本地文件的写入等,非常具有实用价值,需要的朋友可以参考下...2020-06-25
C#使用Http Post方式传递Json数据字符串调用Web Service
这篇文章主要为大家详细介绍了C#使用Http Post方式传递Json数据字符串调用Web Service,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25- C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
- 这篇文章主要为大家详细介绍了SpringBoot实现excel文件生成和下载,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-02-09
php无刷新利用iframe实现页面无刷新上传文件(1/2)
利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25- 要替换字符串中的内容我们只要利用php相关函数,如strstr,str_replace,正则表达式了,那么我们要替换目录所有文件的内容就需要先遍历目录再打开文件再利用上面讲的函数替...2016-11-25
- 又码了一个周末的代码,这次在做一些关于文件上传的东西。(PHP UPLOAD)小有收获项目是一个BT种子列表,用户有权限上传自己的种子,然后配合BT TRACK服务器把种子的信息写出来...2016-11-25
- 步骤:Window -> PHP -> Editor -> Templates,这里可以设置(增、删、改、导入等)管理你的模板。新建文件注释、函数注释、代码块等模板的实例新建模板,分别输入Name、Description、Patterna)文件注释Name: 3cfileDescriptio...2013-10-04
- 今天小编在这里就来给photoshop的这一款软件的使用者们来说下AI源文件转photoshop图像变模糊问题的解决教程,各位想知道具体解决方法的使用者们,那么下面就快来跟着小编...2016-09-14
- 这篇文章主要介绍了C++万能库头文件在vs中的安装步骤(图文),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-02-23
- 本篇文章主要说明的是与php文件上传的相关配置的知识点。PHP文件上传功能配置主要涉及php.ini配置文件中的upload_tmp_dir、upload_max_filesize、post_max_size等选项,下面一一说明。打开php.ini配置文件找到File Upl...2015-10-21
ant design中upload组件上传大文件,显示进度条进度的实例
这篇文章主要介绍了ant design中upload组件上传大文件,显示进度条进度的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-10-29- 这篇文章主要介绍了C#使用StreamWriter写入文件的方法,涉及C#中StreamWriter类操作文件的相关技巧,需要的朋友可以参考下...2020-06-25
- 举一个案例:复制代码 代码如下:<?phpclass Downfile { function downserver($file_name){$file_path = "./img/".$file_name;//转码,文件名转为gb2312解决中文乱码$file_name = iconv("utf-8","gb2312",$file_name...2014-06-07
- 这篇文章主要介绍了C#路径,文件,目录及IO常见操作,较为详细的分析并汇总了C#关于路径,文件,目录及IO常见操作,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25