php6及以上版本中微信接口开发$GLOBALS[“HTTP_RAW_POST_DATA”]需要always_populate_raw_post_data=on,这个方法不推荐使用

微信接口开发中的 $GLOBALS[“HTTP_RAW_POST_DATA”],针对php6及以上服务器环境,php.ini中always_populate_raw_post_data默认配置是-1,但是微信接口文件中[$GLOBALS[“HTTP_RAW_POST_DATA”]]需要设置为on。所以默认情况下,接口开发接口信息是有问题的。

有2种解决方法:

1、直接修改php.ini中

always_populate_raw_post_data=on 后重启服务器,这个能解决微信开发问题,但是若我们服务器上有其他项目如:tp3中自动开启session的,就会报错!就会出现类似如下的错误:

session_start(): Cannot send session cache limiter - headers already sent

总结:修改php.ini   always_populate_raw_post_data = On会影响到其他项目;

 

2、不修改服务器配置的前提下,直接修改接口文件用 file_get_contents(“php://input”)  代替$GLOBALS[“HTTP_RAW_POST_DATA”] 即可完美解决。xuduowei 亲测无误!推荐使用!

 

php oop开发中, static::$var 的用法

static::$var 会强制使用当前调用对象所属类中的变量 $var 的值。表现条件:类的继承。

案例一:

class a{
   static protected $test="class a";
   public function static_test(){
     echo static::$test; //class b
     echo self::$test;   //class a
   }
}
class b extends a{
   static protected $test="class b";
}
 
$obj = new b();
$obj->static_test();

案例二:

class par{
    const v='A';
    public function f1()
    {
        echo static::v;//静态绑定static::
    }
    public function f2()
    {
        echo self::v;
    }
}
class child extends par{
    const v='B';
}
$b=new child();
$b->f1();  //result: 'B'
echo '<br>';
$b->f2();  //result: 'A'

 

PHP 快速实现数组去重

使用PHP的array_unique()函数允许你传递一个数组,然后移除重复的值,返回一个拥有唯一值的数组。这个函数大多数情况下都能工作得很好。但是,如果你尝试在一个大的数组里使用array_unique()函数,它会运行地慢一些。

有一个比较好而且更快的函数array_flip()来替代使用array_unique()函数来创建唯一的数组。这个魔法般的函数会交换数组里面每一个元素的键和值,因为键值必须唯一,因此,你会得到跟array_unique()函数一样的结果。

更快的方式实现PHP数组去重

/* 创建一个包含重复值的,一共四个元素的数组 */

$array = array(‘green’,’blue’,’orange’,’blue’);

/* 翻转数组,你将会得到唯一键值的数组

array(‘green’=>0,’blue’=>1,’orange’=>2); */

$array = array_flip($array);

/* 然后再翻转一次,将键和值重新放置,然后得到数组:array(0=>’green’,1=>’blue’,2=>’orange’); */

$array = array_flip($array);

因为我们已经移除了一些元素,因此数组看起来不是正常的序列。比如我们可能会得到:array(0=>’A’,2=>’B’,5=>’C’);。在某些情况下,这不是一个问题,但是如果你需要数组的键值保持数字的序列,你可以使用一到两种方法解决键值乱序的问题。

使用array_merge修复数组的keys

添加array_flip之后的函数,将会对数组的键值排序并且让它们恢复到正常的序列,如:0,1,2,3…

$array = array(‘green’,’blue’,’orange’,’blue’);

$array = array_flip($array);

$array = array_flip($array);

/* 使用array_merge()函数修复键值*/

$array = array_merge($array);

第二种方式,使用array_keys

注意,这种修复数组键值的方法比使用array_merge()函数稍微快了一点。你也可以在最后一步结合使用array_keys()函数(此函数返回翻转后的值)。然后当你翻转数组的值,键值就会根据顺序创建。

$array = array(‘green’,’blue’,’orange’,’blue’);

$array = array_flip($array);

/* 跟第一个例子一样,但是现在我们先提取数组的键值 */

$array = array_keys($array);

NoSQL

NoSQL泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
虽然NoSQL的流行与火起来才短短一年的时间,但是不可否认,现在已经开始了第二代运动。尽管早期的堆栈代码只能算是一种实验,然而现在的系统已经更加的成熟、稳定。不过现在也面临着一个严酷的事实:技术越来越成熟——以至于原来很好的NoSQL数据存储不得不进行重写,也有少数人认为这就是所谓的2.0版本。该工具可以为大数据建立快速、可扩展的存储库。

百科:https://baike.baidu.com/item/NoSQL/8828247?fr=aladdin

NoSQL数据库的四大分类

键值(Key-Value)存储数据库
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
列存储数据库。
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
文档型数据库
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
图形(Graph)数据库
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.
因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。

Nosql简介 Redis,Memchche,MongoDb的区别

https://www.cnblogs.com/lina520/p/7919551.html

 

 

PHP加密工具选择,ioncube和ZendOptimizer各自的优点是什么

他们各自的优缺点是:
ZendOptimizer(Zend Guard):
1、Zend Guard只能对带有PHP标记或源码的文件进行加密,对于其他不带有PHP标记的文本方式保存的文件不能进行加密操作
2、ZendGuard只能用于配置了ZendOptimizer的环境中,不能独立运行
3、ZendGuard在PHP4下的错误,对于PHP4的绝对路径及相对路径在加密时会出现较大的差别。
4、支持PHP4.2.X~5.2.X版本的加密
5、使用的ZendOptimizer(PHP引擎)可以提高源码20~50%以上的速度优化,结合ZendGuard可以提高至50%以上的性能速度 优化,且ZendOptimizer可以安装于当前较多主流系统中

ionCube:

1、ionCube不仅可以加密带有PHP标记或源码的php文件还可以对非php文件的以text方式保存的文件进行加密操作,如xml,js,css等。(但是读写时必须使用 ionCube所提供的读入API进行读写操作。)
2、ionCube在功能方面经过测试可以优胜于Zend公司的 ZendGuard,不仅支持期限,注册码,等加密方式,还支持对IP,MAC地址等复杂的加密方式
3、可加密的PHP版本从PHP4.0.6~5.2.X(比ZendGuard高2个级别)
4、ionCube与Zend一样,为了提高PHP性能优化也提供了相应的PHP引擎,可以为大多数操作系统提供PHP优化功能,但是可惜的是,至今未提供Windows版本的PHP引擎。
5、ZendGuard在PHP4下的错误,在ionCube中没有出现,可以看出ionCube相对稳定
6对于ionCube来说,对带有PHP标记或源码的文件采用压缩加密方式处理,对于非php的文本类文件则采用加密方式处理。在读入时必须使用 “ioncube_read_file/ ioncube_write_file”读写文件。因此在使用ionCube加密前需要对相应的PHP代码进行改造后才能使用。

ionCube官方:

http://www.ioncube.com/loaders.php

 

 

thinkphp5事务的处理,事务中涉及到循环的处理方案-徐多蔚【合肥php老师】原创。

function ac(){
		$obj=new \app\admin888\model\ProductsModel;
		$b=1;//标志成功的状态,一般失败,就修改其为0
				for($j=0;$j<=10;$j++){
					for($i=0;$i<=5;$i++){
						$obj->db->query("insert into cbd_products_attr_guige set uid=5");
						if($i==4){//一旦与遇错
							//Db::rollback();//可以省略,在try那里一起操作
							$b=0;//设置出错标志
							break;//终止本次循环,不可少。
						}
					}

					if(!$b){//外层循环中判断里面有错误,则外层也终止。数据库回滚。
						//Db::rollback();在try那里一起操作
						break;//终止本次循环,不可少。
					}
				}
				//echo 1;
				return $b;
	}


	function trya(){
		
		// 启动事务
			Db::startTrans();
			try{
				$b=$this->ac();
				if($b){
					Db::commit();
					return 1;
				}else{
					Db::rollback();
					return 0;
				}
				
			} catch (\Exception $e) {
				//echo 0;
				// 回滚事务			
				Db::rollback();			
				return 2;				
			}
	}

	//测试
	function cs(){
		echo $this->trya();
	}

 

TP5中的No input file specified/解决PHP5.6版本“No input file specified”的问题

问题描述:使用TP框架做项目时,在启用REWRITE的伪静态功能的时候,首页可以访问,但是访问其它页面的时候,就提示:“No input file specified.”
原因在于使用的PHP5.6是fast_cgi模式,而在某些情况下,不能正确识别path_info所造成的错误
默认的.htaccess里面的规则:

IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>

“No input file specified.”,是没有得到有效的文件路径造成的。
修改后的伪静态规则,如下:

IfModule mod_rewrite.c>
  Options +FollowSymlinks
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php?/$1 [QSA,PT,L]
</IfModule>

仅仅就是在正则结果“/$1”前面多加了一个“?”号,问题也就随之解决了。

原创:商城开发中,真正唯一订单雏形-插入订单,获得订单的id,把订单id拼装到自定义订单号中

@$mysql = mysql_connect('localhost','root','root');
mysql_query('set names utf8');
mysql_select_db('test');

//$sql="insert into ddd2 set uid='".$str."'";
//ddd2表模拟订单表,字段uid模拟订单号字段
$sql="insert into ddd2 set addtime='".date("Y-m-d H:i:s")."'";
mysql_query($sql);
//$id=mysql_insert_id();
$idrs=mysql_fetch_array(mysql_query("SELECT LAST_INSERT_ID()"));//用此代替mysql_insert_id()就可以解决非int型自增长取值不准的bug问题。
$id=$idrs[0];
//我们可以在更新前对$iddiy进行拼装。
$iddiy=$id;
$sql="update ddd2 set uid='".$iddiy."' where id=".$id;//uid模拟订单号字段
mysql_query($sql);
//apache下自带的ab.exe并发高压测试
//ab.exe -c 100 -n 100 http://127.0.0.1/a1.php

附上测试表结构:

CREATE TABLE `ddd2` (
  `id` bigint(11) NOT NULL AUTO_INCREMENT,
  `uid` varchar(100) DEFAULT NULL,
  `addtime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uid` (`uid`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

 

$idrs=mysql_fetch_array(mysql_query("SELECT LAST_INSERT_ID()")); 有人会问为什么这样写呢?因为mysql_insert_id()是有bug的。在int型下是可以在的,在非int型如:bigint下,mysql_insert_id()取值就不准了。

本文章由:徐多蔚  徐老师 xuduowei原著。转载请注明来源,谢谢。

 

Mysql_insert_id的一个缺陷

mysql_insert_id() 将 MySQL 内部的 C API 函数 mysql_insert_id() 的返回值转换成 long(PHP 中命名为 int)。

如果 AUTO_INCREMENT 的列的类型是 BIGINT,则 mysql_insert_id() 返回的值将不正确。

作为替代方案,我们可以在 SQL 查询中用 MySQL 内部的 SQL 函数 LAST_INSERT_ID() 。

$sql="insert into ddd2 set addtime='".date("Y-m-d H:i:s")."'";
mysql_query($sql);
//$id=mysql_insert_id();
$idrs=mysql_fetch_array(mysql_query("SELECT LAST_INSERT_ID()"));//用此代替mysql_insert_id()就可以解决非int型自增长取值不准的bug问题。
$id=$idrs[0];