一、PHP curl https访问问题
原代码:
代码语言:javascript复制/* @String url URL地址
* @Array data POST数据
* @Resource curl cURL对象
* @return info 返回信息
*/
$curl = curl_init(); // 启动一个cURL会话
curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址
curl_setopt($curl, CURLOPT_HEADER, 0); //返回header部分
curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/xml"));
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); //返回字符串,而非直接输出
curl_setopt($curl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']); // 模拟用户使用的浏览器
curl_setopt($curl, CURLOPT_POST, 1); // 发送一个常规的Post请求
curl_setopt($curl, CURLOPT_POSTFIELDS, $data); // Post提交的数据包
curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环
$info = curl_exec($curl); // 执行操作并返回数据
curl_close($curl); // 关闭cURL会话
https访问错误,加入了cURL查看错误方法curl_error()
代码语言:javascript复制$error = curl_error ($curl);//需放在curl_close($curl)执行之前
var_dump($error);
返回的错误信息为:
SSL certificate problem, verify that the CA cert is OK
HTTPS协议服务器进行SSL验证的问题
解决方法有多种,可以将HTTPS改为使用HTTP协议(可行的情况下),也可以通过cURL选项设置为禁止验证(推荐):
代码语言:javascript复制curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
参看PHP手册中关于cURL选项的描述:PHP: curl_setopt
CURLOPT_SSL_VERIFYPEER:
禁用后cURL将终止从服务端进行验证。使用CURLOPT_CAINFO选项设置证书使用CURLOPT_CAPATH选项设置证书目录 如果CURLOPT_SSL_VERIFYPEER(默认值为2)被启用,CURLOPT_SSL_VERIFYHOST需要被设置成TRUE否则设置为FALSE。
CURLOPT_SSL_VERIFYHOST:
检查服务器SSL证书中是否存在一个公用名(common name)。译者注:公用名(Common Name)一般来讲就是填写你将要申请SSL证书的域名 (domain)或子域名(sub domain)。2 检查公用名是否存在,并且是否与提供的主机名匹配。
注意按手册规定:
CURLOPT_SSL_VERIFYPEER 属于应该被赋予一个bool类型值的选项;
CURLOPT_SSL_VERIFYHOST 属于应该被赋予一个integer的选项。
更改之后问题就解决了。
值得一提的是,当cURL出现错误和问题时,curl_exec()将返回FALSE,可以使用上面提到的curl_error()方法输出错误原因。此方法必须在curl_close()之前使用。
二、检测字符串是否由纯英文,纯中文,中英文混合组成
代码语言:javascript复制*function:检测字符串是否由纯英文,纯中文,中英文混合组成
*param string
*return 1:纯英文;2:纯中文;3:中英文混合
*/
public function check_str($str=''){
if(trim($str)==''){
return '';
}
$m=mb_strlen($str,'utf-8');
$s=strlen($str);
if($s==$m){
return 1;
}
if($s%$m==0&&$s%3==0){
return 2;
}
return 3;
}
三、Composer管理PHP包
安装
Composer包含两大逻辑部分:一个是用来存储包,另一个是命令行应用程序,帮助你发现、下载、更新和分享代码。
$ cd/path/to/my/project
$ curl -s http://getcomposer.org/installer| php
在项目列表中,会有一个composer.phar文件,里面包含了所有逻辑代码行工具。你可以通过运行下面代码来确定是否安装成功。
$ php composer.phar
这个命令执行后会显示所有可用的命令。
我个人比较建议大家使用这个命令:
$ sudo mv composer.phar /usr/bin/composer
把这个文件移到bin目录下,它允许你简化命令。
$ composer about
四、PHP5中的stdClass
PHP5中新增stdClass
官方手册参考:http://www.php.net/manual/en/language.oop5.basic.php#92123
stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法。stdClass类可以被继承,只是这样做没有什么意义。
该类是PHP的保留类,并不是所有类的基类。
代码语言:javascript复制<?php
class foo {}
$bar = new foo();
echo $bar instanceof stdClass?'yes':'no';
//output:no
另外一个例子:
代码语言:javascript复制<?php
// CTest does not derive from stdClass
class CTest {
public $property1;
}
$t = new CTest;
var_dump($t instanceof stdClass); // false
var_dump(is_subclass_of($t, 'stdClass')); // false
echo get_class($t) . "n"; // 'CTest'
echo get_parent_class($t) . "n"; // false (no parent)
?>
任何用(object)强制转换都会得到一个stdClass的实例。
五、php中文乱码问题
HTML中文乱码问题的解决方法。
比如有个index.html的页面(这里是指真正的静态页面,修改服务器的……伪静态的请看方案B)
1.在head标签里面加入这句
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
2.将文件的编码存为UTF-8.记事本或Editplus等编辑器都有保存时选择编码的功能。
HTML和PHP混合的页面解决方案。
除了A方案说的那些之外。还要在文件的最上面加上下面这句代码。
<?php
header("Content-type:text/html;charset=utf-8");
?>
注意header前面不要有任何的输出(echo/print/print_r/var_dump等PHP的输出语句,或者是你在“<?php”前面回车/空格)。否则会报错。 如果你用系统自带的Notepad保存为UTF-8编码的文件时会报错,“<?php”标签前面经存在3个不可见元素。如果你用UltraEdit打开并切换到16进制模式可以看到前面多了“EF BB BF”。这是跟Windows识别编码的方式有关。Apache无法解析,把它当成了输出。导致header出错。 或者,直接使用Editplus保存为UTF-8即可。因为Editplus的UTF-8是去除了BOM的。
纯PHP页面的中文乱码解决方案(数据是静态的)
只要在页面的开始加上
<?php
header("Content-type:text/html;charset=utf-8");
?>
然后保存为UTF-8编码的文件即可。注意和方案B一样。注意用那些去除BOM的编辑器保存。否则还是会报错。
PHP Mysql中文乱码解决方案
除了按方案C那样的做法外,还要在你的数据查询/修改/增加之前加入数据库编码。
<?php
mysql_query('SET NAMES UTF8');
?>
注意这里的UTF8和之前的不一样。中间没有横线。