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

php

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

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

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

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

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

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

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

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

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

    / 分类: 开发 / 6 Comments

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

    javascript部分:

    1. $("#btn").click(function(k) {
    2.     //...
    3.     var j = form.serializeArray();//序列化name/value
    4.     $.ajax({
    5.         url: "另一个域名/test.php",
    6.         dataType: 'jsonp',
    7.         data: j,
    8.         jsonp: 'jsonp_callback',
    9.         success: function(json) { //返回的json数据
    10.             json = json || {};
    11.             if (json.msg=='err'){
    12.                 alert(json.info);
    13.             }else if (json.msg=="ok"){
    14.                 alert('提交成功');
    15.             }else{
    16.                 alert('提交失败');
    17.             }
    18.         },
    19.         timeout: 3000
    20.     })
    21.     //...
    22. });

    php部分:

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

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

  • 抓网页内容file_get_contents curl fopen

    / 分类: 开发 / No Comments

    1.file_get_contents

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

    2.curl

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

    3.fopen->fread->fclose

    1. $handle = fopen ("http://www.xxx.com/", "rb");
    2. $contents = "";
    3. do {
    4.    $data = fread($handle, 8192);
    5.    if (strlen($data) == 0) {
    6.    break;
    7.    }
    8.    $contents .= $data;
    9. } while(true);
    10. fclose ($handle);
    11. 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

    1. <?php  
    2. function getmicrotime(){
    3.     list($usec, $sec) = explode(" ",microtime());
    4.     return ((float)$usec + (float)$sec);
    5. }

    6. //开始  
    7. $time_start = getmicrotime();
    8.  
    9. //这里放你的代码

    10. //结束
    11. $time_end = getmicrotime();
    12. $time = $time_end - $time_start;

    13. echo "$time seconds"; //输出运行时间
    14. ?>  
  • 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(出于安全性)的原因.
    加@不显示错误信息.