多数大学生出来选择的工作和专业无关
首页 > 专业知识

对于大型系统PHP为什么令人不爽

时间:2018-02-24 17:02:20 [来源]:郑州PHP培训学校

   对于大型系统PHP为什么令人不爽

  我在过去的四年里一直致力于PHP应用的开发。PHP确实十分容易编写。但是PHP也有一些十分严重的缺陷。下面我会给出我的理由,为什么PHP不适合于比小型业余网站更大的网站。
  AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验我在过去的四年里一直致力于PHP应用的开发。PHP确实十分容易编写。但是PHP也有一些十分严重的缺陷。
  下面我会给出我的理由,为什么PHP不适合于比小型业余网站更大的网站。
  1. 对递归的不良支持
  递归是一种函数调用自身的机制。这是一种强大的特性可以把某些复杂的东西变得很简单。有一个使用递归的例子是快速排序(quicksort)。不幸的是,PHP并不擅长递归。Zeev,一个PHP开发人员,说道:“PHP 4.0(Zend)对密集数据使用了栈方式,而不是使用堆方式。也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少。”见bug 1901。这是一个很不好的借口。每一个编程语言都应该提供良好的递归支持。
  2. 许多PHP模块都不是线程安全的
  在几年前,Apache发布了Web服务器的2.0版。这个版本支持多线程模式,在这个模式下,软件一个一部分可以同时运行多个。PHP的发明者说PHP的核心是线程安全的,但是非核心模块不一定是。但是十次有九次,你想要在PHP脚本中使用这种模块,但这又使你的脚本不能合适Apache的多线程模式。这也是为什么PHP小组不推荐在Apache 2 的多线程模式下运行PHP。不良的多线程模式支持使PHP常被认为是Apache 2依然不流行的原因之一。
  3. PHP 因为商业应用而残废
  通过使用缓存,PHP的性能可以陡增500%[见基准测试]。那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者,它在销售自己的Zend Accelerator,所以当然,他们不想抛弃自己的商业产品这块肥肉。
  但是有另一个可选择的: APC. (Zend后来推出Zend Optimizer,免费的加速器——译者)4. 没有命名空间
  设想某个人制作了一个PHP模块用来阅读文件。模块中一个函数叫做read。然后另一个人的模块可以读取网页的,同样包含一个函数read。然后我们就无法同时使用这两个模块了,因为PHP不知道你要用哪个函数。
  但是有一个很简单的解决方法,那就是命名空间。曾经有人建议PHP5加入这个特性,但不幸得是他没有这么做。现在,没有命名空间,每个函数都必须加上模块名作为前缀,来避免名称冲突。这导致了函数名恐怖得长,例如xsl_xsltprocessor_transform_to_xml让代码难于书写和理解。
  5. 不标准的日期格式字符
  很多程序员对 日期格式字符 都很熟悉,它是从UNIX和C语言中来的。其他一些编程语言采用了这个标准,但是很奇怪的,PHP有它自己的一套完全不兼容的日期格式字符。在C中,“%j”表示一年中的当天,在PHP中他表示一个月中的当天。然而使事情更混乱的是:Smarty (一个很流行的PHP模版引擎)的 strftime 函数和 date_format 函数,却使用了C/UNIX的格式化字符。
  6. 混乱的许可证
  你也许认为PHP是免费的,所有的在手册中提到的PHP模块也是免费的。错了!例如,如果你想在PHP中生成PDF文件,你会在手册中发现两个模块:PDF 和 ClibPDF。但是这两个都是有商业许可证的。所以,你所使用的每个模块,你都要确保你同意他的许可证。
 
  使PHP自定义函数返回多个值
  本文讲解了如何使PHP自定义函数返回多个值的代码方法AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验PHP自定义函数只允许用return语句返回一个值,当return执行以后,整个函数的运行就会终止。有时候我们要求函数返回多个值时,用return是不可以把值一个接一个地输出的。但不可忽视的一点是,return语句可以返回任何类型的变量,这就是使自定义函数返回多个值的关键。请看代码:
  function results($string)
  {
  $result = array();
  $result[] = $string;//原字符串
  $result[] = strtoupper($string);//全部换成大写$result[] = strtolower($string);//全部换成小写$result[] = ucwords($string);//单词的首字母换成大写return $result;
  }
  $multi_result = results('The quick brown fox jump over the lazy dog');print_r($multi_result);
  ?>
  输出结果:
  Array
  (
  [0] => The quick brown fox jump over the lazy dog[1] => THE QUICK BROWN FOX JUMP OVER THE LAZY DOG[2] => the quick brown fox jump over the lazy dog[3] => The Quick Brown Fox Jump Over The Lazy Dog)
  以上的代码创建了一个$result数组,然后把处理完毕并等待输出的值添加到$result中作为一个元素,最后把$result输出,这样做就实现了自定义函数返回多个值的目的。
 
  PHP初学者头疼问题总结
  AD:51CTO 网+ 第十二期沙龙:大话数据之美_如何用数据驱动用户体验【1】页面之间无法传递变量 get,post,session在最新的php版本中自动全局变量是关闭的,所以要从上一页面取得提交过来得变量要使用$_GET['foo'],$_POST['foo'],$_SESSION['foo']来得到当然也可以修改自动全局变量为开(php.ini改为register_globals = On);考虑到兼容性,还是强迫自己熟悉新的写法比较好。
  【2】Win32下apache2 用get方法传递中文参数会出错test.php?a=你好&b=你也好
  传递参数是会导致一个内部错误
  解决办法:"test.php?a=".urlencode(你好)."&b=".urlencode(你也好).............
  【3】win32下的session不能正常工作
  php.ini默认的session.save_path = /tmp
  这显然是linux下的配置,win32下php无法读写session文件导致session无法使用把它改成一个绝对路径就可以了,例如session.save_path = c:\windows\temp【4】显示错误信息
  当php.ini的display_errors = On并且error_reporting = E_ALL时,将显示所有的错误和提示,调试的时候最好打开以便纠错,如果你用以前php写法错误信息多半是关于未定义变量的。变量在赋值以前调用会有提示,解决办法是探测或者屏蔽例如显示$foo,可以if(isset($foo)) echo $foo 或者echo @$foo【5】Win32下mail()不能发送电子邮件
  在linux下配置好的sendmail可以发送,在win32下需要调用smtp服务器来发送电子邮件修改php.ini的SMTP = ip //ip是不带验证功能的smtp服务器(网上很难找到)php发送邮件的最好解决方法是用socket直接发送到对方email服务器而不用转发服务器【6】初装的mysql如果没有设置密码,应该使用update mysql.user set password="yourpassword" where user="root"修改密码
  【7】header already sent
  这个错误通常会在你使用HEADER的时候出现,他可能是几种原因:1,你在使用HEADER前PRING或者ECHO了2.你当前文件前面有空行3.你可能INCLUDE了一个文件,该文件尾部有空行或者输出也会出现这种错误。!
  【8】更改php.ini后没有变化
  重新启动web server,比如IIS,Apache等等,然后才会应用最新的设置【9】php在2003上面安装(ISAPI的安装方法恳请高手指教)PHP4的php4isapi.dll好像和2003有些冲突,只能用CGI模式安装步骤一,先www.php.net下在一个安装程序,我是装的是:php-4.2.3-installer.exe,你也可以去找最新的版本,在安装php-4.2.3-installer.exe之前保证你的IIS6.0启动了,并能够访问。 安装好以后,在默认网站-->应用程序配置步骤二:点击 web服务扩展 -->新建web服务扩展.
  步骤三: 扩展名-->php,然后添加
  步骤四:找到php.exe的路径添加上去。
  步骤五: 确定就可以了!
  步骤六: 选择php的服务扩展,然后点击允许。
  【10】
  有时候sql语句不起作用,对数据库操作失败
  最简便的调试方法,echo那句sql,看看变量的值能得到不

上一篇:在PHP中使用与Perl兼容的正则表达式

下一篇:为什么和如何在PHP中使用它们