<?php /** * $str 原始中文字符串 * $encoding 原始字符串的编码,默认utf-8 * $prefix 编码后的前缀,默认"&#" * $postfix 编码后的后缀,默认";" */ function unicode_encode($str, $encoding = 'utf-8', $prefix = '&#', $postfix = ';') { //将字符串拆分 $str = iconv("UTF-8", "gb2312", $str); $cind = 0; $arr_cont = array(); for ($i = 0; $i < strlen($str); $i++) { if (strlen(substr($str, $cind, 1)) > 0) { if (ord(substr($str, $cind, 1)) < 0xA1) { //如果为英文则取1个字节 array_push($arr_cont, substr($str, $cind, 1)); $cind++; } else { array_push($arr_cont, substr($str, $cind, 2)); $cind+=2; } } } foreach ($arr_cont as &$row) { $row = iconv("gb2312", "UTF-8", $row); } //转换Unicode码 foreach ($arr_cont as $key => $value) { $unicodestr.= $prefix . base_convert(bin2hex(iconv('utf-8', 'UCS-4', $value)), 16, 10) .$postfix; } return $unicodestr; } /** * $str Unicode编码后的字符串 * $decoding 原始字符串的编码,默认utf-8 * $prefix 编码字符串的前缀,默认"&#" * $postfix 编码字符串的后缀,默认";" */ function unicode_decode($unistr, $encoding = 'utf-8', $prefix = '&#', $postfix = ';') { $arruni = explode($prefix, $unistr); $unistr = ''; for ($i = 1, $len = count($arruni); $i < $len; $i++) { if (strlen($postfix) > 0) { $arruni[$i] = substr($arruni[$i], 0, strlen($arruni[$i]) - strlen($postfix)); } $temp = intval($arruni[$i]); $unistr .= ($temp < 256) ? chr(0) . chr($temp) : chr($temp / 256) . chr($temp % 256); } return iconv('UCS-2', $encoding, $unistr); } $str = "PHP二次开发:www.php2.cc"; $unistr = unicode_encode($str); $unistr2 = unicode_decode($unistr); echo $unistr . '<br />'; echo $unistr2 . '<br />'; $unistr = unicode_encode($str,'GBK','\\u'); $unistr2 = unicode_decode($unistr,'GBK','\\u'); echo $unistr . '<br />'; echo $unistr2 . '<br />';本文章为各位介绍解决yii webservice 提示:Procedure 'getSent' not present 错误方法,有兴趣的和小编一起看看。
其实根据常用的webservice清除缓存方法,在client端加入这样一句话:
ini_set("soap.wsdl_cache_enabled", "0");
应该就可以了,但是处理了好久,在本地测试没问题,放到服务器上就不行,一直提示:Procedure 'getSent' not present
后来查看PHP的配置文件php.ini,找到这样一句话: soap.wsdl_cache_dir="/tmp"
然后进入对应目录,看到有这样子的文件:
wsdl-root-37c8f47f71a35a60f667be40ae619d0b
wsdl开头的文件,都是webservice的缓存文件,删掉这些文件,再试,一切正常了。
php 防止表单重复提交的方法我相信各位在网上可以找到许多的例子,在这里小编为各位整理了一些常用的方法并且非常的有效了,希望对各位有帮助。用户提交表单时可能因为网速的原因,或者网页被恶意刷新,致使同一条记录重复插入到数据库中,这是一个比较棘手的问题。我们可以从客户端和服务器端一起着手,设法避免同一表单的重复提交。
1.使用客户端脚本
<form method="post" name="register" action="test.php" enctype="multipart/form-data"> <input name="text" type="text" id="text" /> <input name="cont" value="提交" type="button" onClick="document.register.cont.value='正在提交,请等待...';document.register.cont.disabled=true;document.the_form.submit();"> </form>
当用户单击“提交”按钮后,该按钮将变为灰色不可用状态
上面的例子中使用OnClick事件检测用户的提交状态,如果单击了“提交”按钮,该按钮立即置为失效状态,用户不能单击按钮再次提交。
还有一个方法,也是利用JavaScript的功能,但是使用的是OnSubmit()方法,如果已经提交过一次表单,将立即弹出对话框,代码如下:
<script language="javascript"> var submitcount=0; function submitOnce (form){ if (submitcount == 0){ submitcount++; return true; } else{ alert("正在操作,请不要重复提交,谢谢!"); return false; } } </script> <form name="the_form" method="post" action="" onSubmit="return submitOnce(this)"> <input name="text" type="text" id="text" /> <input name="cont" value="提交" type="submit"> </form>
在上例中,如果用户已经单击“提交”按钮,该脚本会自动记录当前的状态,并将submitcount变量自加1,当用户试图再次提交时,脚本判断submitcount变量值非零,提示用户已经提交,从而避免重复提交表单。
2. 使用session(这个与JSP处理方法是一样的)
利用PHP的Session功能,也能避免重复提交表单。Session保存在服务器端,在PHP运行过程中可以改变Session变量,下次访问这个变量时,得到的是新赋的值,所以,可以用一个Session变量记录表单提交的值,如果不匹配,则认为是用户在重复提交。
A页面的代码:
<?php session_start(); //根据当前SESSION生成随机数 $code = mt_rand(0,1000000); $_SESSION['code'] = $code; //将此随机数暂存入到session ?> <form id="form1" name="form1" method="post" action="t2.php"> <p>说明 <input type="text" name="titile" /> <input type="hidden" name="originator" value="<?php echo $code;?>"></p> <p><input type="submit" name="Submit" value="提交" /></p> </form> B页面: <?php session_start(); if(isset($_POST['originator'])) { if($_POST['originator'] == $_SESSION['code']){ echo "ok"; unset($_SESSION["code"]); //将其清除掉此时再按F5则无效 }else{ echo "请不要刷新本页面或重复提交表单"; } }?>PHP 7新特性有那些?PHP 7新特性主要是在性能上提升了不少了,我们可以不使用php加速插件只要使用PHP 7即可达到加速性能了,真是这样吗?我们来看看PHP 7新特性有哪些。
PHP 7在性能方面的突破成为近来最热门的话题之一,目前官方PHP 7.0.0 Beta 2已经发布
新特性
性能提升:PHP 7要比PHP 5.6快两倍
全面一致的64位支持
移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展
新增了空接合操作符(??)【wiki】
$username = $_GET['user'] ?? 'nobody';
// equivalent to: $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
新增加了结合比较运算符(<=>)【wiki】
$a = 1;
$b = 2;
switch ($a <=> $b)
{
case 1:
echo "a > b";
break;
case 0:
echo "a == b";
break;
case -1:
echo "a < b";
break;
}
新增加了函数的返回类型声明【wiki】
function foo(): array {
return [];
}
新增加了标量类型声明【wiki】
//标量声明的主要作用是自动实现参数的强制类型转换
//变量类型声明(int, float, string , bool)
function add(int $a, int $b): int {
return $a + $b;
}
新增加匿名类【wiki】
class Foo {}
$child = new class extends Foo {};
var_dump($child instanceof Foo); // true
可捕获致命错误,较早版本只能通过register_shutdown_function()事后处理。(wiki)
Benchmark
测试代码:
$count = $argv[1];
$a = array();
for ($i = 0; $i < $count; $i++) {
$a[$i] = $i;
}
foreach ($a as $i) {
array_key_exists($i, $a);
}
测试效果如下
可见PHP 7相对于PHP 5.4有数倍以上的速度提升。
社区中的Benchmark结果:
以WordPress开源博客首页为测试场景的测试结果:
HTTPSQS(HTTP Simple Queue Service)是一个基于HTTP GET/POST请求的简单队列服务。
PHP队列服务HTTPSQS的安装和使用
队列(Queue)又称先进先出表(First In First Out),即先进入队列的元素,先从队列中取出。加入元素的一头叫“队头”,取出元素的一头叫“队尾”。利用消息队列可以很好地异步处理数据传送和存储, 当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取消息队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等,也就是实现异步请求。
HTTPSQS 具有以下特征:
● 非常简单,基于 HTTP GET/POST 协议。PHP、Java、Perl、Shell、Python、Ruby等支持HTTP协议的编程语言均可调用。
● 非常快速,入队列、出队列速度超过10000次/秒。
● 高并发,支持上万的并发连接,C10K不成问题。
● 支持多队列。
● 单个队列支持的最大队列数量高达10亿条。
● 低内存消耗,海量数据存储,存储几十GB的数据只需不到100MB的物理内存缓冲区。
● 可以在不停止服务的情况下便捷地修改单个队列的最大队列数量。
● 可以实时查看队列状态(入队列位置、出队列位置、未读队列数量、最大队列数量)。
● 可以查看指定队列ID(队列点)的内容,包括未出、已出的队列内容。
● 查看队列内容时,支持多字符集编码。
● 源代码不超过800行,适合二次开发。
HTTPSQS使用示例:
//生成对账单
public function create_dzd()
{
$sl_id = I('get.sl_id','','intval');
$sl_uid = I('get.sl_uid','','intval');
$this->send_task->startTrans();//开启事务
$data['st_params'] = $sl_id;
$data['st_seller_id'] = $sl_uid;
$data['st_type'] = 3;
$data['st_add_time'] = time();
$data['st_success'] = 1;//1后台生成对账单
$data['st_is_compelete'] = 0;
$data['st_ip'] = get_client_ip(1);
$id = $this->send_task->add($data);
if($id){
$httpsqs = $this->getHttpsqs();
$name = self::EXPORT_RECORD;
$rs = $httpsqs->put($name, $id);
if($rs){
$this->send_task->commit();
$this->ajaxReturn(array('code'=>0, 'msg'=>'已经开始生成!'));
}else{
$this->send_task->rollback();
$this->ajaxReturn(array('code'=>2, 'msg'=>'生成对账单失败'));
}
}else{
$this->ajaxReturn(array('code'=>3, 'msg'=>'生成对账单失败'));
}
}
这就是一个队列的应用,生成对账单,入队列,同时把记录写入到一张表记录。另一个java脚本读取队列,进行处理,更新记录。
HTTPSQS封装在一个类中,调用的时候这样调用:
//初始化队列服务
private function getHttpsqs()
{
import("COM.Httpsqs");
$httpsqs = new Httpsqs("192.168.1.8", 1218, "dafadsfasfsadfsa", 'utf-8');
return $httpsqs;
}
但是要使用HTTPSQS,必须有一台队列服务器,这个服务器装了队列服务。
以上初始化队列,也指定了ip,端口,来连接队列服务器,才能进行队列的操作。
HTTPSQS服务器端安装方法:
ulimit -SHn 65535
wget http://httpsqs.googlecode.com/files/libevent-2.0.12-stable.tar.gz
tar zxvf libevent-2.0.12-stable.tar.gz
cd libevent-2.0.12-stable/
./configure --prefix=/usr/local/libevent-2.0.12-stable/
make
make install
cd ../
wget http://httpsqs.googlecode.com/files/tokyocabinet-1.4.47.tar.gz
tar zxvf tokyocabinet-1.4.47.tar.gz
cd tokyocabinet-1.4.47/
./configure --prefix=/usr/local/tokyocabinet-1.4.47/
#注:在32位Linux操作系统上编译Tokyo cabinet,请使用./configure --enable-off64代替./configure,可以使数据库文件突破2GB的限制。
#./configure --enable-off64 --prefix=/usr/local/tokyocabinet-1.4.47/
make
make install
cd ../
wget http://httpsqs.googlecode.com/files/httpsqs-1.7.tar.gz
tar zxvf httpsqs-1.7.tar.gz
cd httpsqs-1.7/
make
make install
cd ../
更具体的服务器端HTTPSQS队列服务的安装和编译,参考:https://code.google.com/p/httpsqs/