解决php中openssl pkey_new()创建中文数字证书乱码问题
用openssl创建证书时, 编码用utf-8, 中文证书出现乱码。经多项测试未能解决。
在apache2.2中创建不成功。 后升级服务器,使用apache2.4+php5.5, 重新执行,成功。
$dn = array(
"countryName" => 'Zh', //所在国家名称
"stateOrProvinceName" => '北京', //所在省份名称
"localityName" => '北京', //所在城市名称
"organizationName" => '北京理房通支付科技有限公司', //注册人姓名
"organizationalUnitName" => '北京理房通支付科技有限公司', //组织名称
"commonName" => '北京理房通支付科技有限公司', //公共名称
);
print_r( $dn);
$numberofdays = 365; //有效时长
$cerpath = "./pem.cer"; //生成证书路径
$res = openssl_pkey_new();
$csr = openssl_csr_new($dn, $res); //证书
$sscert = openssl_csr_sign($csr, null, $res, $numberofdays); //签名
openssl_x509_export($sscert, $csrkey); //导出证书$csrkey
//生成证书文件
$fp = fopen($cerpath, "w");
fwrite($fp, $csrkey);
fclose($fp);
最近分别在WIN7和Windows8 上分别安装php 高版本!都遇到了这个问题!
一.win7系统32位, apache2.2, php5.2升级到5.4.
这个比较容易:
1. phpinfo发现没有加载curl;
2. 在php.ini中设置extension_dir 指向e:\php5.4\ext; 部分php扩展加载了, 但curl仍不行。
3. 设置windows系统环境变量, phpext, 指向e:\php5.4\ext, PHPRC 指向e:\php5.4
设置path环境变量,添加e:\php5.4
4. 重新启动apache, 终于出来了, 大功告成!
一.win8系统64位, apache2.2, php5.4 , v9版
首先前面win7下的都执行了, 但死活不行!也下载了许多64位的php_curl.dll, 也不行!
发现很可能是加载依赖的问题! 最后解决!
1. 执行前面win7下的1-4步!
2. 下载:http://www.dependencywalker.com/
3. 查看php版本中的php_curl.dll模块依赖!自行尝试吧, 运行并找到php_curl.dll路径, 打开查看依赖库。
4. 在http.conf中最后,添加:
LoadFile E:/PHP/php-5.4/php5ts.dll
LoadFile E:/PHP/php-5.4/libeay32.dll
LoadFile E:/PHP/php-5.4/ssleay32.dll
LoadFile E:/PHP/php-5.4/libssh2.dll
LoadModule php5_module "E:/PHP/php-5.4/php5apache2_2.dll"
AddType application/x-httpd-php .php
5. 重启, 大功靠成!
三总结:
主要问题, php要下载安全版本;各种方法都试了, 仍不行, 就查看依赖并尝试添加。
php包里的php_curl.dll扩展应是可用的, 不要随便替换。 另外, 尽管php文档注释32位环境才需加依赖, 事实不是这样。
花了我半天的时间!
Memcach是web应用/Drupal应用性能提高的利器,近期在使用Memcache中,发现有很多小问题,因此作者特意总结了几个,放上来供大家参考使用。
1. Memcache和Memcached的区别
这个是历史问题,但是,言而总之:名字长的更牛逼!
所以,推荐使用memcached。
另外,memcached有很多新特性,包括getMulti/setMulti、支持存储object、支持count+1操作,都会比memcache的好用一些,可以试试,或许以后支持更多的操作,赶上redis。。
Drupal大学上关于memcache的问答:http://../apachesolr_search/memcache
如下(摘自德问):
#Memcache
$m = new Memcache();
$m->addServer('localhost', 11211);
$v = $m->get('counter');
$m->set('counter', $v + 1);
#由于get/set这两个动作无法作为一个原子来操作,所以当多个进程同时处理时,
#会出现丢失的可能,更让人恼火的是,你根本就不知道什么时候出现丢失。
#Memcached
$md = new Memcached();
$md->addServer('localhost', 11211);
$v = $md->get('counter', null, $token)
$md->cas($token, 'counter', $v + 1);
#cas是Memcached版本里提供的功能,说白了就是一个乐观锁的功能,
#如果你把$token的值var_dump出来,就会发现$token其实就是一个版本号,
#如果通过get得到的$token版本号在cas的时候不对应,就说明已经有别的操作更新了,
#此时cas操作会失败,至于如何继续操作,就看你自己了
两者的区别如下,下面是Memcache的方法:
下面是memcached的方法:
2. Memcache的哈希策略
常规的hash策略是取模,比如key=10, 有两台服务,就10%2=0,算出该值分布在第一台服务器上。
那么缺点也很明显,比如服务器增加一台,之前的分布式策略全完蛋。
因此,业界需要更牛逼的算法~
一致性hash算法隆重登场!
简单说来,一致性hash算法就是先把服务器也通过某一个特征(如IP/MAC地址)hash一下,这样服务器会按照分布(可能不均匀)在一个范围,然后把key再hash一下,然后看key最近的下个服务器作为该key的存储bin。
这样,如果增加一台服务器,重新分配的key只是分布再新增的这个服务器和上一个最近的服务器之间的key,其余的都不变。
初步的服务器分布:
增加服务器的分布:
上面的描述的是白话,可能比较拗口,笔者文字水平有限,详情见下面的链接:
http://blogread.cn/it/article/5271
http://blog.csdn.net/kongqz/article/details/6695417
3. Memcache的hash策略配置
Memcache安装完成之后,可以设置哈希策略,memcache.hash_strategy。目前有standard模式和consistent模式。standard模式其实就是%,即取模。而consistent,就是hash的一致性算法。
在Memcache中,hash策略在PHP.ini文件中设置
[Memcache]
Memcache.allow_failover = 1
……
……
Memcache.hash_strategy =consistent
Memcache.hash_function =crc32
在Memcached中,hash策略在PHP的参数中设置:
mem = new memcached();
$mem->setOption(Memcached::OPT_DISTRIBUTION,Memcached::DISTRIBUTION_CONSISTENT);
$mem->setOption(Memcached::OPT_LIBKETAMA_COMPATIBLE,true);
4. 后记
因此正常情况下,推荐使用一致性哈希算法,但凡事无绝对,比如一个小的站点,memcache的服务几乎永不会增加,这是用常规的standard的算法也是比较推荐的,毕竟一致性算法存在一个均匀分布的问题(可能已经解决了。。)
最近小峰在开发项目的时候遇到一个问题就是阻塞问题。用的是thinkphp框架,利用ajax请求一次操作,在ajax没有返回结果前,相同程序,其它操作是无效的。然后网上一查,有人和我有一样的问题,下面把该解决方法分享出来。
当同时向服务端发现若干HTTP请求,有时你会发现这些请求可能并非并发完成的,服务器对这些请求进行了排队处理,产生了所谓的PHP阻塞现象。最有可能是脚本进行了session数据的读写,PHP中session默认使用文件系统进行存储的,当进行读写session文件操作时,存储session的文件处于锁定状态,此时其他需要读写session数据的请求需要等待前一个请求完成后才会进行,从而导致PHP阻塞的发生,庆幸的是PHP提供了session_write_close()函数来结束当前session并写入数据。
session阻塞简单演示
创建2个php文件:session_a.php,session_b.php。
<?php
// session_a.php
session_start();
$_SESSION['a'] = date('H:i:s');
// session_write_close();
sleep(5);
echo $_SESSION['a'];
<?php
// session_b.php
session_start();
$_SESSION['b'] = date('H:i:s');
// session_write_close();
sleep(5);
echo $_SESSION['b'];
同时访问这2个脚本,你会发现,其中一个脚本比另一个延迟了5秒。而当我们将文件中的session_write_close()函数注释取消掉后,再来同时访问发现2个脚本可以同时执行了。
session锁定处理机制
顺便提一下,session_commit()是session_write_close()的别名,即也可以使用前者替代后者。
当session_start()调用时,session处理机制默认会打开或创建一个seesion文件,且会立即给这个文件上了一个锁定状态(locked)。当session_commit()调用时或脚本执行完成后该文件会被解锁(unlocked)。
锁定状态有个重要的影响:同时请求使用了session的PHP脚本,并非并列执行的,而是分离的。如果当用户发起了一个请求,同时发起另一个请求便会被阻塞,直至前一个请求完全完成。
Session锁定的好处
请不要勿以为这所谓的阻塞现象是PHP的BUG,当然不是,相反有些时候分离执行才是正确的做法。考虑一下购物车案例:
用户发起A请求,脚本读取用来显示购物车物品的session数据;
在A请求完成之前,用户便点击了“加入购物车”按钮,发送了个B请求;
B等待A请求完成,然后向session中新增数据;
如果没有对session进行锁定会发生什么?
B没有等待A完成,读取并写入session数据;
A请求完成并写入之前读取的session数据,覆盖了上述B写入的数据;
所以,我们在使用session时应当考虑当前实际环境。
ThinkPHP如何解决session阻塞
最近开始使用国内的PHP框架ThinkPHP,便遇见了阻塞问题,因为没仔细看官方文档,调试许久未果,差点一怒之下放弃该框架,后发现配置项里有个“SESSION_AUTO_START”配置,用于自动加载session,果断设置为FALSE,一切恢复正常。
在需要使用session的时候,可以使用PHP自带函数:
session_start();
//...
session_commit(); // 或session_write_close()
也可以用TP风格方式:
session('[start]');
//...
session('[pause]');
出现这种情况,原因可能是:
1、所有的页面都要继承自 BbsPageBase
2、aspx页面放在 max-templates目录下的某个模板目录下
3、aspx.cs代码文件必须放在 _codes目录下的对应 max-templates 的子目录
相关文章
- Create Procedure AtoC @ChangeMoney Money as Set Nocount ON Declare @String1 char(20) Declare @String2 char(30) ...2016-11-25
- 这篇文章介绍了C#判断字符串是否数字或字母的实例,有需要的朋友可以参考一下...2020-06-25
- CREATE FUNCTION ChangeBigSmall (@ChangeMoney money) RETURNS VarChar(100) AS BEGIN Declare @String1 char(20) Declare @String2 char...2016-11-25
- 这篇文章主要为大家详细介绍了C#实现猜数字游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-06-25
- 设置登录密码我们一般会有限制的如由什么组合了,下面我们来看一篇关于安卓开发之设置密码只能输入字母和数字的组合方法,具体的细节如下所示。 无论是电脑还是手机...2016-09-20
php导出csv格式数据并将数字转换成文本的思路以及代码分享
php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."/n";然后对需要保存csv的数组进行foreach循环,例如复制代...2014-06-07- 这篇文章主要介绍了C#判断一个字符串是否是数字或者含有某个数字的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 关于生成唯一数字ID的问题,是不是需要使用rand生成一个随机数,然后去数据库查询是否有这个数呢?感觉这样的话有点费时间,有没有其他方法呢?当然不是,其实有两种方法可以解决。 1. 如果你只用php而不用数据库的话,那时间戳+随...2015-11-24
- 这篇文章主要介绍了C#将数字转换成字节数组的方法,涉及C#字符串操作的技巧,非常具有实用价值,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了C++实现数字转换为十六进制字符串的方法,涉及C++操作数字与字符串转换的相关技巧,需要的朋友可以参考下...2020-04-25
- php实现数字格式化,数字每三位加逗号的功能函数,具体代码如下: function num_format($num){ if(!is_numeric($num)){ return false; } $num = explode('.',$num);//把整数和小数分开 $rl = $num[1];//小数部分的值...2015-10-23
- 这篇文章主要介绍了Lua判断变量是否为数字、字符串是否可以转换为数字等,本文讲解了Lua 判断是字符还是数字的方法、Lua判断数字的方法、判断可否转换为数字的方法、判断并且准备一个初值的方法,需要的朋友可以参考下...2020-06-30
- 复制代码 代码如下: $str='asb天水市12'; if (preg_match("/^[/x7f-/xff]+$/", $str)){ echo '全部是汉字'; }else { echo '不全是汉字'; } /** PHP自带的判断是否是中文, eregi('[^/x00-/x7F]', $str ) //中文 ereg...2013-10-04
- 这篇文章主要介绍了python基于OpenCV模板匹配识别图片中的数字,帮助大家更好的理解和学习使用python,感兴趣的朋友可以了解下...2021-03-31
- 这篇文章主要介绍了C++ 随机数字以及随机数字加字母生成的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-11
解决php中openssl pkey_new()创建中文数字证书乱码问题
使用openssl生成证书如果是纯数字的肯定是没有任何的问题了,但是碰到中文数字时会发现就出问题了,证书变成了乱码了,下文来看解决办法。 用openssl创建证书时, 编码...2016-11-25- // 原是是根据用户输入的数字判断再转换成想要的大写数字,如果我们先把大小写存在一个数组,再判断进行转换就OK了。 $data = $_POST['rmb']; if (!ereg("^[0-9.]",$dat...2016-11-25
- 这篇文章主要介绍了c++连续输入未知个数的数字操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-12-09
- 这篇文章主要介绍了JS验证逗号隔开可以是中文字母数字 的相关资料,需要的朋友可以参考下...2016-04-24
- 这篇文章主要介绍了javascript常见数字进制转换,结合实例形式分析了JavaScript十进制,十六进制及二进制的相互转换原理与技巧,需要的朋友可以参考下...2016-04-23