专注于WEB前端开发, 追求更好的用户体验, 更好的开发体验 [长沙前端QQ群:234746733]

php

  • PHP 读取大文件的X行到Y行的内容

    / 分类: 开发,实践 / 5 Comments

    最新写了个小程序,需要读取一个文件的几行内容,但是文件比较大,所以研究了下PHP读取大文件的几行内容的方法,写了一个方法,代码如下(加了注释):

    //返回文件从X行到Y行的内容(支持php5、php4)
    function getFileLines($filename, $startLine = 1, $endLine=50, $method='rb') {
    $content = array();
    $count = $endLine - $startLine;
    if(version_compare(PHP_VERSION, '5.1.0', '>=')){// 判断php版本(因为要用到SplFileObject,PHP>=5.1.0)
    $fp = new SplFileObject($filename, $method);
    $fp->seek($startLine-1);// 转到第N行, seek方法参数从0开始计数
    for($i = 0; $i <= $count; ++$i) {
    $content[]=$fp->current();// current()获取当前行内容
    $fp->next();// 下一行
    }
    }else{//PHP<5.1
    $fp = fopen($filename, $method);
    if(!$fp) return 'error:can not read file';
    for ($i=1;$i<$startLine;++$i) {// 跳过前$startLine行
    fgets($fp);
    }
    for($i;$i<=$endLine;++$i){
    $content[]=fgets($fp);// 读取文件行内容
    }
    fclose($fp);
    }
    return array_filter($content); // array_filter过滤:false,null,''
    }

    Ps:
    上面都没加"读取到末尾的判断":!$fp->eof() 或者 !feof($fp),加上这个判断影响效率,自己加上测试很多很多很多行的运行时间就晓得了,而且这里加上也完全没必要。

    从上面的函数就可以看出来使用SplFileObject比下面的fgets要快多了,特别是文件行数非常多、并且要取后面的内容的时候。fgets要两个循环才可以,并且要循环$endLine次。

    此方法花了不少功夫,测试了很多中写法,就是想得出效率最高的方法。哪位觉得有值得改进的欢迎赐教。

    使用,返回35270行-35280行的内容:

    echo '<pre>';var_dump(getFileLines('test.php',35270,35280));
  • jquery jsonp Ajax 跨域提交数据 (PHP)

    / 分类: 开发 / 6 Comments

    最近做了一个Ajax提交反馈页,但是由于空间不支持一些基本的函数,所以准备做个跨域提交。

    javascript部分:

    $("#btn").click(function(k) {
        //...
        var j = form.serializeArray();//序列化name/value
        $.ajax({
            url: "另一个域名/test.php",
            dataType: 'jsonp',
            data: j,
            jsonp: 'jsonp_callback',
            success: function(json) { //返回的json数据
                json = json || {};
                if (json.msg=='err'){
                    alert(json.info);
                }else if (json.msg=="ok"){
                    alert('提交成功');
                }else{
                    alert('提交失败');
                }
            },
            timeout: 3000
        })
        //...
    });

    php部分:

    $jsonp_callback=$_GET['jsonp_callback'];
    //...
    //如果正确
    echo $jsonp_callback,'({"msg":"ok"})';
    //如果错误
    echo $jsonp_callback,'({"msg":"err","info":"因人品问题,发送失败"})';
    //...

    值得注意的是采用jsonp 方式,beforeSend / error 都不能用了,所以beforeSend里面用js实现的验证只能用ajax在服务器端test.php上面验证了。

  • 抓网页内容file_get_contents curl fopen

    / 分类: 开发 / No Comments

    1.file_get_contents

    $url = http://www.xxx.com/;
    $contents = file_get_contents($url);
    //如果出现中文乱码使用下面代码
    //$getcontent = iconv("gb2312", "utf-8",file_get_contents($url)); 
    //echo $getcontent;
    echo $contents;
    

    2.curl

    $url = "http://www.xxx.com/";
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    //在需要用户检测的网页里需要增加下面两行
    //curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    //curl_setopt($ch, CURLOPT_USERPWD, US_NAME.":".US_PWD);
    $contents = curl_exec($ch);
    curl_close($ch);
    echo $contents;
    

    3.fopen->fread->fclose

    $handle = fopen ("http://www.xxx.com/", "rb");
    $contents = "";
    do {
       $data = fread($handle, 8192);
       if (strlen($data) == 0) {
       break;
       }
       $contents .= $data;
    } while(true);
    fclose ($handle);
    echo $contents;
    

    Ps
    1.使用file_get_contents和fopen必须空间开启allow_url_fopen。方法:编辑php.ini,设置allow_url_fopen = On,allow_url_fopen关闭时fopen和file_get_contents都不能打开远程文件。
    2.使用curl必须空间开启curl。方法:WIN下修改php.ini,将extension=php_curl.dll前面的分号去掉,而且需要拷贝ssleay32.dll和libeay32.dll到C:\WINDOWS\system32下;Linux下要安装curl扩展。

  • 计算PHP脚本运行时间

    / 分类: 开发 / No Comments

    <?php   
    function getmicrotime(){
        list($usec, $sec) = explode(" ",microtime());
        return ((float)$usec + (float)$sec);
    }
    
    //开始   
    $time_start = getmicrotime();
     
    //这里放你的代码
    
    //结束
    $time_end = getmicrotime(); 
    $time = $time_end - $time_start;
    
    echo "$time seconds"; //输出运行时间
    ?>  
    
  • php的nn乘法表

    / 分类: 开发 / No Comments

    现在只能搞这么初级的东西。。

    PHP代码
    1. <?php   
    2.     $n = @$_GET['n'];   
    3.     for ($a=1;$a<=$n;$a++) {   
    4.         for ($b=1;$b<=$a;$b++) {   
    5.         echo "$a*$b=".($a*$b)." ";   
    6.         }   
    7.     echo '<br />';   
    8.     }   
    9. ?>  

    加$n = $_GET['n']因为PHP.ini中的register_global=off(出于安全性)的原因.
    加@不显示错误信息.