解决yii webservice 提示:Procedure 'getSent' not present 错误

 更新时间:2016年11月25日 15:34  点击:2105
本文章为各位介绍解决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递归算法就是函数调用函数了操作非常的简单了,我们下面来给各位介绍PHP递归算法及实际的一些关于递归的用法。

递归函数为自调用函数,在函数体内直接或间接自己调用自己,但需要设置自调用的条件,若满足条件,则调用函数本身,若不满足则终止本函数的自调用,然后把目前流程的主控权交回给上一层函数来执行,可能这样给大家讲解,还是很难明白,直接上例子

function test ($n){

echo $n.”  “;

if($n>0){

test($n-1);

}else{

echo “<?>”;

}

echo $n.”  ”

}

test(2)

这个例子最终的输出结果是2 1 0<?>0 1 2

我解释下  为何输出是这样的

第一步,执行test(2),echo 2,然后因为2>0,执行test(1), 后面还有没来得及执行的echo 2
第二步,执行test(1),echo 1,然后因为1>0,执行test(0),同样后面还有没来得及执行的 echo 1
第三步,执行test(0),echo 0,执行test(0),echo 0,  此时0>0的条件不满足,不在执行test()函数,而是echo “<?>”,并且执行后面的 echo 0

此时函数已经不再调用自己,开始将流程的主控权交回给上一层函数来执行,也就是开始执行刚刚所有test()函数没来得及输出的最后一个echo,0的一层是1也就是输出1  1的上一层是2 也就是输出2    2没有山一层  所以呢   输出的内容就是2 1 0<?>0 1 2


如何考虑用PHP递归算法来解决问题

 

例:求s=1+2+3+4+5+6+……+n本来这个问题我们过去常用循环累加的方法。而这里如要用递归的方法,必须考虑两点:
1) 能否把问题转化成递归形式的描述;
2) 是否有递归结束的边界条件。

显然递归的两个条件都有了:

1) s(n) =s(n-1)+n  
2) s(1)=1
所以源程序为:

int progression(int n){   

int res;   

if (n=1 )res=1 else res=progression(n-1)+n;   

return res;   

}

中序遍历二叉树

void inorder (BinTree T){   

if (T){   

inorder(T->lchild);   

printf(“%c”,T->data);   

inorder(T->rchild);   

}   

}

Mysql

 

首先我们准备一张数据表class,记录商品分类信息。表中有三个字段,id:分类编号,主键自增长;title:分类名称;pid:所属上级分类id。

class表结构:

CREATE TABLE IF NOT EXISTS `class` ( 

  `id` mediumint(6) NOT NULL AUTO_INCREMENT, 

  `title` varchar(30) NOT NULL, 

  `pid` mediumint(6) NOT NULL DEFAULT '0', 

  PRIMARY KEY (`id`) 

) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

插入数据后,如图:

 

 

根据不同的需求,我们提供两种不同格式的自定义函数,一种是返回字符串,一种是返回数组,两种函数都使用了递归方法。先看返回字符串格式的函数:

function get_str($id = 0) { 

    global $str; 

    $sql = "select id,title from class where pid= $id";  

    $result = mysql_query($sql);//查询pid的子类的分类 

    if($result && mysql_affected_rows()){//如果有子类 

        $str .= '<ul>'; 

        while ($row = mysql_fetch_array($result)) { //循环记录集 

            $str .= "<li>" . $row['id'] . "--" . $row['title'] . "</li>"; //构建字符串 

            get_str($row['id']); //调用get_str(),将记录集中的id参数传入函数中,继续查询下级 

        } 

        $str .= '</ul>'; 

    } 

    return $str; 

}

以上函数get_str()通过递归,不断查询下级分类,并最终返回字符串,大家可以根据项目需求修改其中的str,最终生成一个无限分级列表:

include_once('connect.php'); //连接数据库,connect.php文件自己写一个啊 

echo get_str(0); //输出无限级分类

效果如:

 

 

接着我们来看返回数组格式的函数,一样要使用递归:

function get_array($id=0){ 

    $sql = "select id,title from class where pid= $id"; 

    $result = mysql_query($sql);//查询子类 

    $arr = array(); 

    if($result && mysql_affected_rows()){//如果有子类 

        while($rows=mysql_fetch_assoc($result)){ //循环记录集 

            $rows['list'] = get_array($rows['id']); //调用函数,传入参数,继续查询下级 

            $arr[] = $rows; //组合数组 

        } 

        return $arr; 

    } 

}

函数get_array()返回了数组,这是我们期待的,所以笔者推荐使用get_array()得到数组,这样一来,我们可以对数组进行任意操作,比如我们可以将数组转换成json格式的数据传给前端页面,前端页面可以通过解析json数据灵活展示分类信息。比如树形结构的分类列表,下拉分类列表等。

include_once('connect.php'); //连接数据库 

$list = get_array(0); //调用函数 

print_r($list); //输出数组

如果要输出json格式的数据,则可使用:

 

echo json_encode($list);

 

Unicode编码我们用到的不多因为Unicode编码在源码中都是字符了,但有时会用到Unicode编码了,下面我们一起来看一篇PHP Unicode编码相互转换的例子,希望例子能够对各位有帮助。
<?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 />';

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开源博客首页为测试场景的测试结果:

[!--infotagslink--]

相关文章