惠邻网 (huilinwang.com)致力于高质量的互联网大中型应用开发及其运行维护|共享技术|分享经验

PHP外包项目开发需要谨慎新手接单

发布于2011年01月03日 总共被阅读992次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月12日 下午 14:03:36

PHP程序开发web已经非常普遍,随之带来的外包项目也变得很多。一直以来,总会接到不少类似‘擦屁股’之类的项目。请千万不要小看这种‘擦屁股’的事情,赶上了,干上一年半载的也很正常。最关键的是,无论你做多少努力,总是会有问题出现,而且出现的问题又常常是‘前人’的问题。即使你完成了当前的问题,随后的问题将会是更大的挑战。直到有一天系统重构。

所以,重构就是最后的解决方案了。‘重构’只是美名罢了,实际上也就是,建议客户放弃之前的工作,完全重新开始。下来我们就来说说,为什么在PHP外包项目开发中需要谨慎新手接单。其实不光是php的项目,各种项目亦是如此。

很多朋友把实现功能看做开发,这样想是大错特错的。功能的实现致使项目开发的第一步而已 ,仅仅是第一步。如果要是算上后期的维护和升级,我想功能的实现甚至算不上第一步。在现在这个互联网环境下,几乎任何代码都能从网上获取,甚至直接获取开发好的成品项目。但是,如何能称之为外包,而不是安装一个成品呢?关键就在于适应客户的需求,以及客户的潜在升级需求。

无论是在独立开发还是其他系统的二次开发上,首先要看的当然是开发小组的技术实力。相同的功能,不同的开发组,开发时间相差10倍甚至更多是很正常的事情。其次,就要做好需求、时间工期等方面的协调工作。

除此之外,我们更多的应该关注开发组的相关经验,互联网其实也快成为一个传统行业了,在这个行业里经验也变得越来越为重要。

看过很多站长的网站部分代码,原作者大多都是一些刚入门的水平。

  1. 无所谓什么网站目录,完全一团乱麻,没有可读性,后续的工作几乎无法展开
  2. 没有安全入口,没有初始化,没有可配置,重复、重叠代码随处可见
  3. 没有class、没有函数、没有框架
  4. 命名混乱,完全自主,想着来

这样的系统,没有什么实际价值,只是在浪费时间和精力,能做的只有从新做来。开发者的经验不同,时间成本也不同,代码的质量也会出现很大差异,还有一些潜在的安全隐患和程序BUG,直接影响到后期的成本。有时候看似合理的逻辑,程序也很正常,当为了运营需要改变其中一个业务逻辑时,可能整个网站都会被推翻重做,这是非常可怕的。

为什么PHP外包项目大多都是新手在做?如今大学里还没有开设PHP语言课程,很多都是通过自学和培训入门,在做互联网应用最多的一线城市中,如北京:一个刚毕业的初级PHP程序员,月薪是3000+,中级程序员5000-8000,高级的大多都在8000-10000+,这21个工作日还不算各种保险和补助。而一些建站公司,在日益激烈的竞争中,一个普通企业站收取的费用大概是2000-3000,一般周期最多5-10天,为了降低成本,有些公司甚至把程序、美工压缩为同一个人,大多时候,简单的网站只需要套模板即可,不需要太专业(企业站谁在乎代码写怎样),因此在找建站公司做PHP开发的时候,还需要对他们有更多的了解,运气不好的话,你的网站可能就是一些程序员入门的代表作了。

最后有几句想说给初学者的话:

  • 坚持,任何时候都要坚持才能上升和前进
  • 虚心,不是所有的经验和提高都是随手而来的,有时候需要极大的代价
  • 踏实,好高骛远没有好处,最终你能到达的高度由你单飞那一刻的能力决定
  • 自信,相信自己,而不是相信自己的能力

如何删除-打头的文件呢?

发布于2012年05月19日 总共被阅读15次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月19日 下午 23:52:29

参照手册:

To remove a file whose name starts with a `-', for example `-foo',
use one of these commands:
  rm -- -foo

  rm ./-foo

唉……

SQUID Your cache is running out of filedescriptors 问题解决

发布于2012年05月18日 总共被阅读13次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月18日 下午 21:03:08

看SQUID默认配置文件,参考修改,如下:

max_filedescriptors 4096

重新启动,查看日志文件:

With 4096 file descriptors available

参考:http://www.huilinwang.com/blog/post/359.html

其实参考的部分用处不大,只是个说明。

SQUID 10 swapin MD5 mismatches

发布于2012年05月18日 总共被阅读11次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月18日 下午 22:29:04

squid的cache.log日志中类似如下的警告:  

WARNING: 10 swapin MD5 mismatches

这个错误是说squid读入一个缓存文件的时候,存储在接口对应的位置的URL不是squid认为应该存储在那里的数据。这可能是swap.state有错误或文件指到了磁盘上错误的块(文件系统有错误)。

停止squid应用,删除swap.state然后启动squid,让它通过读取缓存文件来重建缓存记录,如果重建后仍然出现上面的情况,那应该就是文件系统或磁盘有问题了。

Ubuntu Memcached

发布于2012年05月16日 总共被阅读24次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月16日 下午 17:22:42
apt-cache search memcached

apt-get install memcached

vim /etc/memcached.conf 

/etc/init.d/memcached restart

apt-get install php-memcached

 

wget http://livebookmark.net/memcachephp/memcachephp.zip
unzip  memcachephp.zip
cp memcache.php /var/www/

svn Skipped Node remains in conflict

发布于2012年05月14日 总共被阅读34次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月14日 下午 19:54:01

svn 更新出现错误 Skipped Node remains in conflict,处理办法:

svn remove --force filename
svn resolve --accept=working  filename
svn status
svn commit

svn local delete, incoming delete upon update 解决办法

发布于2012年05月14日 总共被阅读35次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月14日 下午 20:38:21

svn local delete, incoming delete upon update 解决办法

# 1.In your working directory, recreate that conflicting file:
$ touch foo
# 2.Revert that file to the state SVN likes (that means deleted):
$ svn revert foo
# 3.Now delete that file:
$ rm foo
# 4.Conflict resolved:
$ svn st
# Done.

除了IE7都能打开的页面,在IE7报JS错

发布于2012年05月12日 总共被阅读26次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月12日 下午 13:26:30

JS代码使用了,传出数组的配置文件方式。

开始为了省事写作:

$.xxx(
   {
    width  : 685,
    height  : h,
    autoSize : false,
   }
  );

IE7报错,js错误,页面卡在一般无法继续执行继续的js代码。

修复后,小心最后一行的结束

$.xxx(
   {
    width  : 685,
    height  : h,
    autoSize : false
   }
  );

NicEditor上传文件失败,报错statusCb函数不存在的一种可能

发布于2012年05月12日 总共被阅读17次 发布者:周琳@HL 创业中 在坚持  最后更新于2012年05月12日 下午 20:08:17

查看范例上传代码,可以看到调用top的函数statusCb,而恰巧,我们是在iframe中使用了niceditor,所以这里只需要将top改成parent即可:

function nicupload_output($status, $showLoadingMsg = false) {
  $script = '
         try {
             ' . (($_SERVER ['REQUEST_METHOD'] == 'POST') ? 'top.' : '') . 'nicUploadButton.statusCb(' . json_encode ( $status ) . ');
         } catch(e) { alert(e.message); }
     ';
  
  if ($_SERVER ['REQUEST_METHOD'] == 'POST') {
   echo '<script>' . $script . '</script>';
  } else {
   echo $script;
  }
  
  if ($_SERVER ['REQUEST_METHOD'] == 'POST' && $showLoadingMsg) {
   echo '
     <html><body>
         <div id="uploadingMessage" style="text-align: center; font-size: 14px;">
             <img src="http://js.nicedit.com/ajax-loader.gif" style="float: right; margin-right: 40px;" />
             <strong>Uploading...</strong><br />
             Please wait
         </div>
     </body></html>
 ';
  
  }
  exit ();
 }

修改后代码:

function nicupload_output($status, $showLoadingMsg = false) {
  $script = '
         try {
             ' . (($_SERVER ['REQUEST_METHOD'] == 'POST') ? 'parent.' : '') . 'nicUploadButton.statusCb(' . json_encode ( $status ) . ');
         } catch(e) { alert(e.message); }
     ';
  
  if ($_SERVER ['REQUEST_METHOD'] == 'POST') {
   echo '<script>' . $script . '</script>';
  } else {
   echo $script;
  }
  
  if ($_SERVER ['REQUEST_METHOD'] == 'POST' && $showLoadingMsg) {
   echo '
     <html><body>
         <div id="uploadingMessage" style="text-align: center; font-size: 14px;">
             <img src="http://js.nicedit.com/ajax-loader.gif" style="float: right; margin-right: 40px;" />
             <strong>Uploading...</strong><br />
             Please wait
         </div>
     </body></html>
 ';
  
  }
  exit ();
 }