PHP实现SVN管理的一些总结

来源:互联网 发布:齐次变换矩阵 含义 编辑:程序博客网 时间:2024/06/03 20:33

PHP实现SVN管理的一些总结

刚做完一个hr用的邮件发送系统,大体是先将要发送的文件存在SVN中,再通过web获取列表选择提交,最后将文件附加都邮件中再发送到指定邮箱,在这里总结一下教训。

目标

  1. 实现邮件信息获取、自动更新、批量邮件发送(不同地址)、抄送。
  2. 我自己的附加目标:nginx单一接口、安全校验、口令登陆、session记录登陆状态、MVC设计初应用保证未来的可扩展

思路

  1. 先搭建一个单一入口的服务器,再在入口写上校验规则,只允许特定的访问路径,再根据url读取要访问的页面和要进行的操作,在后台处理、抓取页面放到入口。
  2. 借用MVC模型,从client到server,View展示页面与数据,Controller读取前端数据判断要进行的操作,Model最后实现操作,入口实现调控校验功能。
  3. 限制url,一加强安全,二通过从中读出的信息进行下一步操作。到这里的三步已经差不多把系统框架定下来了。
  4. 填页面、写交互、后台操作数据、实现具体功能。

遇到的问题和解决办法

1、问题:PHP7不支持SVN扩展库

用exec()直接用linux命令操作SVN,也可用shell语句,原理都是用php操作linux,间接操作SVN。

2、问题:用exec()执行linux命令成功,但执行关于SVN操作时失败

这里有两个问题
一是权限,exec()执行linux命令时是以php.ini里设置的默认权限来执行命令的,一般不是root权限,所以这里可能会出现权限不够的问题,可以用exec("whoami")简单直接的看一下exec()下是什么权限。
二是字符编码问题,我在网上看到这种问题在所执行的操作有中文输入或者输出时经常发送,我这里的具体情况是linux系统编码是utf-8、php设置的默认编码是utf-8,然而,在执行exec()时编码格式就不识别了。。。非要加上export LC_CTYPE="zh_CN.UTF-8"才能运行。
还有需要牢记的是执行linux的输入输出流问题,liunx命令在执行时的输入输出流是可以定向的,0输入、1正确输出、2错误输出,以前只知道这些没想过这个怎么用,失策呀失策。本次开发好多时间浪费在定位exec()语句发生的问题上,就是上面两个问题,但如果在exec中加上1 >> /tmp/svn.log 2>&1生成日志文件,就可以直接从日志文件中看出错误了,以后遇到错误一定要先找到在哪看错误信息、再学会如何看错误信息。

3、问题:web提交的要发送的文件列表是由多个文件名组成的列表,当选择文件很多时会发生请求失败的问题。

先分析问题原因,抓包的反馈结果就是请求超时,邮件少的时候一切正常多的时候才出问题,我开始想是不是请求过大了?然后先看nginx里面有没有client_max_body_size请求body大小限制以及client_body_timeout请求时间限制,发现没有这方面限制,然后去找php.in里面的post_max_sizes限制post的大小,但没有结果nginx没找到类似设置,php.ini大小限制8M,粗略算了下一个文件名一般30-40B,基本没影响。
既然大小没影响应该就是时间方面的问题了,再联想到我们的服务器连接发邮件的smtp服务器贼慢,感觉很可能是时间问题。先看nginx发现没有时间方面的设置,再去php.ini查看max_execution_timephp最大执行时间为30s,好再算一下请求状态从请求到超时的时间发现差很多,在代码中加入set_time_limit (60);,发现没什么变化,重复几次后发现没什么影响。
在网上有人说这个如何php-fpm设置了request_terminate_timeoutphp.ini中设置的max_execution_time就不会起作用,然后去看了php-fpm.conf,发现果然设置了request_terminate_timeout,但值为10000s呀。现在回过头来看,感觉问题还是出在nginx上,我搜了一下nginx里面关于timeout的代码,发现了这句keepalive_timeout 65;,在网上搜了一下发现这句是设置server与client的keep-alive连接超时时间,八成就是他了。
这里有多种解决办法,我能想到1->修改nginx设置、2->限制一次提交发送邮件数量、3->将一次提交分成几次小请求提交;最后我的做法是采用限制一次提交发送邮件数量的方式。

4、问题:速度慢的问题?

这个问题分成三块,一是邮件发送速度慢,二是svn up速度慢,三是前端处理速度慢。邮件发送速度慢这个是硬伤,同一批次发的越多越慢,这是服务器问题,之前请求超时问题就是因为它,在这里我只能用3中的方法来处理;svn up速度慢也是服务器连接外网比较慢引起的,在这里我只能想办法减少svn up的次数,现在的想法是直接用一个文件存储svn版本号和目录信息,之后每次直接比较当前版本号和最新版本号(svn info获取),版本不同再更新,版本相同直接读文件,这样能极大加快页面加载速度。前端方面是因为加载信息较多的问题,配合3中药限制同时发送邮件数量的方法我干脆直接把邮件列表做成分页显示,这样即美观又便捷,还同时解决了2个问题,想想都感觉自己虽然刚入行但还是蛮适合这行的。

5、问题:server与client交互内容的格式问题?

遇到这个问题才发现,原来当用php接收client提交的数据时,默认只识别application/x-www.form-urlencoded格式的数据,简而言之,我用json格式传数据结果php没法用封装好的$_POST来接收数据造成了能接收到请求却提不出数据的情况,最后使用file_get_contents('php://input')才提出来的json数据,另外网上说也可以用$GLOBALS['HTTP_RAW_POST_DATA']来提取数据,但我试了一下没有成功,稍微看了一下PHP文档,发现这种$HTTP_RAW_POST_DATA在PHP7.0.0中已经被移除。所以还是用记住file_get_contents('php://input')这种方式吧。

下面的问题就已经不算是问题了,应该算是自己编程经验不足基础不扎实导致的一些小毛病吧,这次记住了以后一定要改!!!

  1. php转json时索引数组转成数组、关联数组转成对象;
  2. 传值、传地址、传引用三个概念要理清:
    1. 传值是实参赋值给形参,互不影响;
    2. 传地址是一种特殊的传值,传过去的值是一个地址,这样实参与形参指向同一地址是同一对象;
    3. 传引用是真正的传递地址,它让形参指向实参地址,效果与传地址相同。
    4. php除对象外的类型均为值传递,对象变量存储的是一个标识符,即句柄。句柄指向存储在zend_object中的真正的对象,所有对对象变量的操作其实都是对句柄的操作。另外php可以用&把值传递变为引用传递。
    5. js的传递类型分两种情况,基本类型为值传递(Undefined,Null,Boolean,Number,String),引用类型为地址传递(Object,Array,Function,Date等)。
  3. 遍历问题:

    1. PHP常用遍历方法:

      1. for()方法:for($i=0;$i<count($arr);++$i){}基础方法,但这种方法效率低,每次循环都要计算一下长度,当然把count($arr)放外面会好些。
      2. foreach()方法:foreach($arr as $v)效率更高,只能遍历索引数组。
      3. foreach()方法:foreach($arr as $k => $v)同上,foreach遍历关联数组的方法。
      4. 联合使用list()、each()和while循环遍历数组:while(list($k,$v) = each($arr)){}这种方法可以简单地进行关联数组序列化。
    2. js常用遍历方法:

      1. for()方法:for(var i=0;i<arr.length;++i){}需要说一下的是和php不同,js的这种方法虽然将arr.length放在循环中但效率反而比放外面高,这个暂时没弄清楚。
      2. for…in…:for(var i in arr){}i为arr单元的值,不单数组也可遍历对象。
      3. forEach()、map()、filter()等数组的方法进行遍历。
原创粉丝点击