Yii soap 一个奇怪的异常 + 一个不是方法的方法

最近对接第三方通知接口时,出现一个奇怪的问题。

soap的请求,有进入soap service 的 init 事件,确没有进入最终的动作。

暂时查不出原因,因为服务器只有上传的权限,没有拦截报文和相关其它的权限。同时只有目标发起时才发生,都是要钱的,不土豪。。测试不起。。也只能做猜想,尝试各种方法先解决了。

猜想:

1.报文有出现特殊字符,在复制的过程中会被处理,但是本身程序正常处理时,碰到会异常

2.请求不完整,可能第三方通知机制,接通后不等响应就把请求停了。这块不好验证。

3.框架或服务器bug。

经过各种尝试之后,确认了些问题,问题并不出在报文和请求头,因为将报文和请求头保存之后,在本地和在服务端模拟请求。都有正常响应。(不确认是否在各种复制的过程中,特殊字符丢失)

时间紧迫,所以按最快的方式处理。因为init能正常进行访问,所以将通知请求的解析在init中进行处理,解析出目标数据再调用原来的动作。

//获取soap报文,普通的 soap?wsdl是响应报文,不要搞混
$reqxml = file_get_contents ( 'php://input' );
//判断请求报文是否有对应的动作
if ($reqxml && preg_match ( '/xxxxxRequest/', $reqxml ))
//解析xml,得到对应数据
$reqxml = @simplexml_load_string ( $reqxml, NULL, LIBXML_NOCDATA );
//注意有些特殊标签在属性里,需要进行特殊关联。因为只有一个,这边进行了简单处理。
$request = json_decode ( json_encode ( $reqxml ), true );
//自己调用原来的函数。触发对应的通知处理
.....
//函数返回后,和原来的情况一样。没有经过目标函数,所以需要手动输出响应报文
echo '<?xml version="1.0" encoding="UTF-8"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="urn:xxxxxxControllerwsdl" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><SOAP-ENV:Body><ns1:xxxxxxResponse>xxxxxx</ns1:xxxxxResponse></SOAP-ENV:Body></SOAP-ENV:Envelope>';'
//记得关闭,
exit ();

先留位置,因为只是特殊出现。暂时只保留特殊处理。先记录,后面有时间再深入研究解决,好吧。是测试太频繁。。。。钱钱钱的问题。。。。

解决 navicat 导入大sql文件 ,单行过长问题。

前段时间维护一个项目,搞错需求。导致以为是翻新。。。把整个库拷贝了份。。(文件来源貌似是用mysql自带导出的,具体不清楚)

1g多,不算太多,主要一个问题出在sql是以:

insert into table (row…) values (value…), (value…), (value…)….

单行。。没错。。就是单行。很多sql程序,处理该机制是一直循环识别到换行符号。。导致一个问题。内存不够。在内存比较足的机器足足运行了超过半天还不到一半,没耐性的哥想原因。顺便写了写脚本解决。

$file_source = 'c:/xxxx.sql';
$file_target = 'c:/xxxx2.sql';
$rh = fopen ( $file_source, 'rb' );
$wh = fopen ( $file_target, 'wb' );
if ($rh === false || $wh === false) {
	// error reading or opening file
	return true;
}
$count = 0;
$begin = 0;
$span = 300;
$lasttable = '';
while ( ! feof ( $rh ) ) {
	$line = fgets ( $rh );
	if (preg_match ( '/INSERT INTO `(w+)`/ims', $line, $match )) {

		// if ($lasttable == $match [1])
		// continue;
		// // $line=preg_replace('/', $replacement, $subject)
		$lasttable = $match [1];
		// gddebug ( $line );
		// fputs ( $wh, $line );
		$line = preg_replace ( '/),(/ism', ");n INSERT INTO `{$lasttable}` VALUES (", $line );
		// gddebug ( $line );
		// exit ();
	}
	if (preg_match ( '/^--/ims', $line ))
		continue;
	if (preg_match ( '/^/*/ims', $line ))
		continue;
	if (preg_match ( '/LOCK TABLES/ims', $line ))
		continue;
	if (preg_match ( '/UNLOCK TABLES/ims', $line ))
		continue;
	fputs ( $wh, $line );
	// if ($count > $line) {
	// gddebug ( $line );
	// }
	$count ++;
	// if ($count > $begin + $span)
	// exit ();
	// exit;
}
fclose ( $rh );
echo ($count);

1g文件。40分钟导入~

 

PHP 压缩字符串方法

最近帮朋友采集n多数据。bluehost的最大文件数量20w 也不小心就触顶了。

采集东西的时候,因为抓取网页的时间过长,所以担心数据采集漏缺,都把网页文件缓存到虚拟机。so~
决定将不用到的东西,都打包压缩,然后删了文件。但是网页文件相当多。如果删除,后续需要补充什么东西的话相当麻烦。 所以决定放数据库里。bluehost限制的是文件数量,大小是不怎么计较的,按官方的话说,主要担心潜在文件安全,而且最大的扩展也只到30w,所以还是老实清理系统,将html缓存文件和各种采集的特殊数据,都放数据库里。回到整体,就有今天的压缩啦~

顺便符上blushost的数据库大小说明:

https://my.bluehost.com/cgi/help/429

参考:http://www.open-open.com/bbs/view/1319888000999

原文有说过一个失真的情况。具体看应用。因为我这边主要针对文本(网页源文件),所以是最好压缩的。有兴趣去了解原理,就知道为什么图片除了缩小,都不太好压缩,而文本类,轻松就压缩剩几十分之一了。

测试代码:

<?php
$filename = 'test.html';
//文件大小 3.2 M 某某变态网站,不说明了。。。
$filecontent = file_get_contents ( $filename );
// 压缩率最低(gzip压缩算法) 生成结果可以直接写到.gz文件中
$gzencode = gzencode ( $filecontent, 9 );
file_put_contents ( "gzencode.txt", $gzencode );
// 压缩率居中
$gzcompress = gzcompress ( $filecontent, 9 );
file_put_contents ( "gzcompress.txt", $gzcompress );
// 压缩率并列最高
$gzdeflate = gzdeflate ( $filecontent, 9 );
file_put_contents ( "gzdeflate.txt", $gzdeflate );

// 压缩率并列最高
$bzcompress = bzcompress ( $filecontent, 9 );
file_put_contents ( "bzcompress.txt", $bzcompress );

//压缩结果,前三种,文件都压缩到111kb ,最后一种压缩到 79kb。