PHPStorm进行SVN提交报客户端版本太旧的解决方案

前段时间同事使用PHPStorm中的subversion进行SVN提交的时候,总是报一个错;

Cannot checkout from svn: svn: E155021: This client is too old to work with

可是我的却没报任何错。很奇怪,直到后来重新调整SVN我也出现这种情况,才明白。。。。

刚开始我以为是我本机的SVN版本太低,但是最后发现是1.9的,最新版!然后看subversion的版本是1.7.

原因:

由于本机的SVN客户端是1.9版本太高,而PHPStorm中的subversion是1.7,然后先用SVN客户端拉取后,再用PHPStorm来拉取就会提示客户端版本过低了。    

解决方案:

方法一:不要使用SVN客户端进行拉取和更新,全程使用PHPStorm中的subversion。

方法二:如果已经使用SVN客户端进行拉取了,然后又想使用PHPStorm来进行管理,可将目录下的隐藏目录.svn删除,然后再用PHPStorm中的subversion拉取更新。

Linux/ubantu下安装无线网卡连接无线网

闲来无事,将本机系统换为了ubantu系统,丢弃WINDOWS系统了。装了ubantu系统后才发现windows系统真的太慢了。苹果系统之所以好用并不是没有道理的。下面说说我在安装ubantu系统中遇到的奇葩问题吧;

由于我是断网安装的,所以在安装的时候直接就跳过了网络设置。等系统安装好之后在来设置,可是等到系统安装好后,却发现了问题。没有无线网连接。

然后各种百度/谷歌,都没什么建设性意见,看到说是连上网,更新源,更新之后就好了。

当我满怀期待的插上网线更新系统之后,打开系统,发现还是没有无线网连接。然后此时我的内心是崩溃的。

然后在继续查找原因,最后发现可能是网卡驱动的问题,查看本机的无线网卡的型号。发现是broadcom制造的(本人是双系统,win7+ubantu)。

下面就是更新网卡驱动的步骤:

1、打开终端:vim /etc/apt/sources.list 在文件最后加更新源

# Debian 8 "Jessie"
deb http://http.debian.net/debian/ jessie main contrib non-free
----------------2-5都是在终端-----------------------
2、 apt-get update

3、apt-get install linux-headers-$(uname -r|sed 's,[^-]*-[^-]*-,,') broadcom-sta-dkms

4、modprobe -r b44 b43 b43legacy ssb brcmsmac

5、modprobe wl

6、成功----------

7、完成后重启即可使用wifi 记得将1中添加的源删除或注释掉-------------------------

微信上传不使用官方JSSDK上传,采用数据流方式

前段时间写项目的时候,当时写一个上传,因为当时正好在研究数据流的方式,所以采用的数据流方式来做的上传。但是后来审核项目的时候,被要求使用微信官方的JSSDK来上传图片。理由是:部分安卓机在微信浏览器的时候,input标签中的file类型被微信浏览器直接砍掉了。所以会没有任何作用。可是后来我研究发现,采用数据流的形式上传,却可以完美的避过这种缺陷,达到JSSDK的效果。下面上代码吧:

0x01 html表单

 <input accept="image/*" type="file" name="main-file" id="main-file"/>

0x02 JS部分

var reader = new FileReader();
            //将文件以Data URL形式读入页面.
            var Data = {};
            reader.readAsDataURL(document.getElementById("main-file").files[0]);
            reader.onload = function () {
            //将图片转为数据流并赋给Data.格式为:data:image/jpeg;base64,.......后面是base64码
                Data['enctype'] = this.result;
                //这两步是将这个base64数据流放到img标签中的src属性里面,做预览图
                $('.ring').children().remove();
                $('.ring').html('<div class=\"portrait\"> <img style=\"width: 196px;height: 196px;border-radius: 50%;\" src=' + Data['enctype'] + '> </div>');
            }

0x03 PHP部分

//图片数据流处理!
    public function base64DecImg($baseData, $Dir, $fileName){
        // 前台访问URL API
        $__URL__= 'http://g.admin.org/';
        // 服务器根目录绝对路径获取API
        $__root__='/home/wwwroot/img.cc';
        // 上诉两个变量,依据实际情况自行修改
        try{
            $expData = explode(';',$baseData);
            $postfix   = explode('/',$expData[0]);
            if( strstr($postfix[0],'image') ){
                $postfix   = $postfix[1] == 'jpeg' ? 'jpg' : $postfix[1];
                $storageDir = $Dir.'/'.date('ymd').'/'.$fileName.'.'.$postfix;
                $export = base64_decode(str_replace("{$expData[0]};base64,", '', $baseData));
                $returnDir = str_replace(str_replace('/','\\',$__root__),'',$storageDir);
                try{
                    $file = $__root__.'/'.$Dir.'/'.date('ymd').'/';
                    if (!is_dir($file)) mkdir($file,0777);
                    // 检测是否有权限操作
                    if (!is_writable($file)) chmod($file, 0777); // 如果无权限,则修改为0777最大权限
                    file_put_contents($__root__.'/'.$returnDir, $export);
//                    $imgfile = $__root__.'/'.$Dir.'/'.date('ymd').'/8211477463693'.'.'.$postfix;;
                    $imgfile = $__root__.'/'.$returnDir;
                    //检测是否开启exif扩展,用于旋转iphone拍照上传自动旋转
                    if (!function_exists('exif_read_data')) {
                        return;
                    }
                    $img  = @imagecreatefromjpeg($imgfile);
                    if($img === false){
                        return;
                    }
                    $exif = exif_read_data($imgfile);
                    if (!empty($exif['Orientation'])) {
                        switch ($exif['Orientation']) {
                            case 8:
                                $image = imagerotate($img, 90, 0);
                                break;
                            case 3:
                                $image = imagerotate($img, 180, 0);
                                break;
                            case 6:
                                $image = imagerotate($img, -90, 0);
                                break;
                        }
                    }
                    imagedestroy($img);
                    if (isset($image)) {
                        imagejpeg($image, $imgfile);
                        imagedestroy($image);
                    }

                    //缩放图片
                    $config['image_library'] = 'gd2';
                    $config['source_image'] = $__root__.'/'.$returnDir;
                    $config['create_thumb'] = TRUE;
                    $config['maintain_ratio'] = TRUE;
                    $config['width']     = 250;
//                    $config['height']   = 196;

                    $this->load->library('image_lib', $config);
                    if ($this->image_lib->resize())
                    {
                        unlink($__root__.'/'.$returnDir);
                        return $__root__.'/'.$Dir.'/'.date('ymd').'/'.$fileName.'_thumb.'.$postfix;
                    }
                }catch(Exception $e){
                    return false;
                }
            }
        }catch(Exception $e){
            return false;
        }
        return false;
    }

0x04 结语

PHP代码部分就是一个完整的控制器,放在类里面,接收的时候采用同样的post接值,然后将这个数据流传到这个控制器,就直接返回图片地址!

PHP如何有效快速的编写类的步骤

作为初学者来说,在写类的时候,可能会感觉有点模糊,不知道该如何有条理的写一个类,如果只是一味的写增删改查,那么就只能做为初级PHP工程师存在了,根据最近的学习总结及他人给予的建议,我大概整理了一下,PHP中写类的前后顺序:

0x01 权限

   再好的程序,安全性为0,也应该一票否决!这是我奉行的一句话。所以,写一个方法,第一件事应该是判断权限,是否登录,或者当前用户是否拥有访问本页面的权限。

0x02 过滤伪造

   这一步同样是安全上的问题,过滤提交过来的参数,禁止非法参数。不要相信外部提交过来的一切参数。凡是用户提交的,全部过滤。

0x03 功能实现

   前面两步写完之后,才可以开始写本方法需要实现的功能,这一步就大多是增删改查了,不多描述。

0x04 性能

   功能实现后,就可以开始考虑性能了。当然当网站大到一定规模的时候,这个性能可以放到前面来考虑。

0x05 用户体验

   网站最后都是用来给用户访问的,在这个用户至上的时代,用户体验是必不可少的。有合适的地方增加一些优化用户体验的操作是很有必要的(比如:loading图);

如果基于以上方法写一个类的话,那么可以逻辑很清晰,条理很清楚的快速写出来!基本不会出太大问题!当然这只是我的看法,如果您有更好的方法!欢迎与我交流!

使用PHP中EXIF扩展解决iphone拍照上传会旋转90度的问题

0x01 开启EXIF扩展支持

检查是否有PHP中的EXIF扩展库,有的话就修改php.ini中:

1.在php.ini文件中找到;extension=php_exif.dll,去掉前面的分号
2.在php.ini文件中找到;extension=php_mbstring.dll,去掉前面的分号,并将此行移动到extension=php_exif.dll之前,使之首先加载*。
3.找到[exif]段,把下面语句的分号去掉。
;exif.encode_unicode = ISO-8859-15
;exif.decode_unicode_motorola = UCS-2BE
;exif.decode_unicode_intel = UCS-2LE
;exif.encode_jis =
;exif.decode_jis_motorola = JIS
;exif.decode_jis_intel = JIS

0x02 使用exif判断图片是否需要进行旋转

//需要判断的文件路径
$imgfile = $__root__.'/'.$returnDir;
    if (!function_exists('exif_read_data')) {
        return;
    }
    //好像iphone拍照的都是jpg格式,所以这里直接处理jpg图像
    $img  = @imagecreatefromjpeg($imgfile);
    if($img === false){
        return;
   }
   //用exif获取图像信息,并判断是否需要旋转
   $exif = exif_read_data($imgfile);
   if (!empty($exif['Orientation'])) {
         switch ($exif['Orientation']) {
              case 8:
                 $image = imagerotate($img, 90, 0);
                     break;
              case 3:
                 $image = imagerotate($img, 180, 0);
                     break;
              case 6:
                 $image = imagerotate($img, -90, 0);
                     break;
         }
   }
   imagedestroy($img);
   if (isset($image)) {
       imagejpeg($image, $imgfile);
       imagedestroy($image);
   }

  //旋转完毕后,进行图片缩放,一定要先判断旋转原图,然后在进行其他图片处理,
  //缩放图片(采用的CI框架的图片缩放类)
  $config['image_library'] = 'gd2';
  $config['source_image'] = $__root__.'/'.$returnDir;
  $config['create_thumb'] = TRUE;
  $config['maintain_ratio'] = TRUE;
  $config['width']     = 250;

  $this->load->library('image_lib', $config);
  if ($this->image_lib->resize()){
      unlink($__root__.'/'.$returnDir);//删除原图,只保留缩略图
      return $__root__.'/'.$Dir.'/'.date('ymd').'/'.$fileName.'_thumb.'.$postfix;
  }

0x03 其他问题

 我当时在测试的时候,遇到了报下面这个错。
     Allowed memory size of 134217728 bytes exhausted (tried to allocate 12096 bytes)
 这个需要将php.ini的memory_limit = 128M;改为一个更大的值。
 一个php脚本一次请求的内存空间就要超过128M,那不管将memory_limit设置成多大,以后肯定有出问题的时候。
 究其原因,是我在编码时,仅仅对变量赋值,却从来没有 unset ($var) 过。导致了内存占用越来越多,所以以后一个变量不再使用之后,一定要记得unset掉它。