Best PHP Frameworks for 2014

 The end of the year is upon us. Lots has changed in the PHP world in the past 365 days, and the PHP framework scene is more densely populated than ever. Everyone and their dog seems to have an idea of what a good framework should look like, but in the end, do we even know which frameworks actually end up being used in production projects? How many go beyond the stage of thousands of people just doing a demo app in them?

In a small survey we've held open for the past week or so (which has also been mentioned in PHP Weekly), we asked these questions to decide which frameworks deserve our attention in 2014 the most. The prerequisite for participation was merely having experience in more than one framework, seeing as it's pointless to ask someone what their favorite bar was if they've only drunk in one place.

Unfortunately, a big percentage of the answers had to be discarded due to people either refusing the notion that WordPress and similar suites aren't frameworks, or simply due to a blatant disregard of instructions – many responses were written by people who only ever worked in one framework. While their enthusiasm for this framework of choice is noteworthy and admirable, the final result which may end up being skewed by such approaches could hardly be called objective.

Results summary

After discarding the invalid responses, and manually verifying every participant, we were left with the following data:

chart

According to the results, the most promising frameworks for 2014 seem to be:

  • Laravel
  • Phalcon
  • Symfony2

Yii and CodeIgniter seem to be sharing 4th place.

After weeding out the obvious spam, the Laravel results had to be filtered the most, by far. Over half the people who voted for Laravel had zero proof of proficiency, or experience only with Laravel, and had to be discarded – despite this, it still prevailed.

When looking at the answers, on average, the Laravel community seems to mostly favor the ease of entry – virtually no learning curve. Whether that's good or bad is a discussion for another time, seeing as we ended up in this "PHP is bad" mess mostly due to a horde of newbies considering it an easy to enter market, but the excellent documentation, large scale community support and speed of development definitely work in its favor. Another frequently mentioned advantage seems to be an active and impressively alive IRC channel where help is given instantly.

An interesting misconception seems to be that Laravel is responsible for Composer. Many voters, both discarded and valid ones, mention Composer as the main advantage of Laravel, alongside Eloquent orM and the Blade template engine, which is downright odd seeing as Composer is a package manager completely oblivious to the framework it's being used with, if any. For more information, I urge the participants in question to read some of our Composer articles, like this one. Despite all this, having only tried Laravel in demo projects, the results of this survey have piqued my interest enough to build my next production project in it, powered by HHVM.

Phalcon's main advantage was performance over other frameworks and the fact that the framework is such a rounded up package (ORM, template engine, PHQL and more – all in one – little to no need for third party libs, meaning everything stays in-memory, C-based and super fast). Some of the respondents noted the fact that it's installed as an extension as an advantage, because the process of installation weeds out the hobbyists from the serious developers, a notion I personally tend to agree with. When mentioning cons, Phalcon's biggest one was also its biggest advantage – being written in C, it's nigh impossible to check under the hood.

Symfony2 is touted as the most modular and extensible of the bunch, and the most feature complete, mainly due to containing Doctrine2. Its voters, however, do seem able to admit that it's quite bloated and slow at times due to this feature-richness.

Interestingly, two ZF1 answers said they're stuck on said framework because of the work situation – their team or CTO refuses to switch to something more modern.

8个最佳PHP库

 英文原文:8 Best Php Libraries for Developers

  PHP标准库 (SPL)的目的就是提供一组接口,让开发者在PHP5中充分利用面向对象编程。因此本文我们搜集了8个最好的,能辅助开发者简化他们的工作,为他们的开发任务服务的PHP库。

1. Whoops : 更好的php错误报告库

whoops

Whoops是一个易于处理和调试错误的PHP库 。它提供基于堆栈的的错误处理和好看的错误界面。它有个简单的API来处理异常,跟踪帧和数据,并能和任何框架整合(随时可用的集成端和Silex)。

 

2. PhpFastCache

phpfastcache

phpFastCache 是一个开源的 PHP 缓存库,只提供一个简单的 PHP 文件,可方便集成到已有项目,支持多种缓存方法,包括:apc, memcache, memcached, wincache, files, pdo and mpdo。可通过简单的 API 来定义缓存的有效时间。

 

3. Eden : 功能强大的 PHP 库

eden-php-library

Eden是一个开源且免费的PHP快速开发类库。它包含很多组件用来自动加载、事件驱动、文档系统、缓存、模板、国际化、数据库、web服务、支付网关、装载和云服务技术。为了给我们最好的选择,他已经将现有的函数实现了与谷歌服务(Youtube, Drive, Contacts, Analytics, Checkout, Maps),Facebook(脸谱), Twitter(推特), Tumblr(轻博客), PayPal(贝宝), Authorize.net, FedEx(联邦快递), UPS(联合包裹服务公司), Amazon + Rackspace Clouds(亚马逊+Rackspace 云)等服务的交互。

 

4. Php Error

php-error

PHP Error 是一个开源的 PHP 库,用于转换标准的 PHP 错误信息,主要用于开发过程中的调试。PHP Error 紧密集成到 PHP 环境中,显示带语法高亮的错误提示。

 

5. Detector

detector

Detector是一个开源的PHP类库用于检测关于用户的浏览器环境的许多东西。它可以获得浏览器的使用和浏览器的html5 css3功能,分析是否移动电话、平板电脑、桌面或网页爬虫和其他项如:颜色深度, 视口尺寸、cookie等支持。类库可以自动适应新的浏览器、版本和设备对每一个浏览器使用独特的用户代理字符。

 

6. Opauth

opauth

Opauth 是一个开源的 PHP 库,提供了 OAuth 认证的支持,让你无需关注不同 Provider 之间的差别,提供统一标准的访问方法。目前支持 Google、Twitter 和 Facebook,其他的 Provider 支持也将陆续提供。同时也支持处理任何 OAuth 认证提供方。

 

7.pChart

pchart

pChart 是一个 PHP 类库用来创建各种图表,可从 SQL 查询、CSV 文件以及手工提供图表的数据来源。强项是图表的渲染质量,该项目开发活跃,每周都有新特性和 bug 修复。

 

8. Php Thumb

phpthumb

PHP Thumb 是一个 PHP 的类用来生成图片的缩略图。 只需数行代码即可,支持多种图片来源,包括文件系统或者数据库,支持大多数图片格式。并可对图片进行旋转、剪切、加水印等等。可执行定义缩略图的质量,提供内建的缓存以降低服务器的负载。

CSDN论坛PHP版主推荐的开发者看的书籍

 《Jquery 权威指南》

《深入PHP 面向对象.模式与实践》

《PHP5 MYSQL5 Web开发技术详解》 我买的第一版 比较多错误的地方,不过知识面比较广

《高性能Javascript》

《Javascript高级程序设计》不知道现在出到第几版了可能是第三

《MySQL5 权威指南》也许是第四版了

《PHP 和MySQL Web开发》 这本圣经可以有

《精通 正则表达式》 电子工业出版 

php基于phpQuery的通用采集类

  用phpQuery来做采集,非常地简单,没有头疼的正则表达式的困扰,类似JQ的选择器操作,很容易上手。

PHP代码
  1. <?php  
  2.   
  3.   /** 
  4.   *通用列表采集类 
  5.   *版本V1.3 
  6.   *作者:JAE 
  7.   * 
  8.   */  
  9.     require_once '../phpQuery/phpQuery/phpQuery.php';  
  10.     class QueryList{  
  11.           
  12.         private $pageURL;  
  13.          private $regArr = array();  
  14.          public $jsonArr = array();  
  15.          private $regRange;  
  16.          private $html;  
  17.          /************************************************ 
  18.          * 参数: 页面地址 选择器数组 块选择器 
  19.          * 【选择器数组】说明:格式array("名称"=>array("选择器","类型"),…….) 
  20.          * 【类型】说明:值 "text" ,"html" ,"属性"  
  21.          *【块选择器】:指 先按照规则 选出 几个大块 ,然后再分别再在块里面 进行相关的选择 
  22.          *************************************************/  
  23.          function QueryList($pageURL,$regArr=array(),$regRange='')  
  24.          {  
  25.              $this->pageURL = $pageURL;  
  26.       
  27.              //为了能获取https://  
  28.                $ch = curl_init();  
  29.                 curl_setopt($ch, CURLOPT_URL,$this->pageURL);  
  30.                 curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   
  31.                 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);  
  32.                 curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);   
  33.                 $this->html = curl_exec($ch);  
  34.                curl_close($ch);  
  35.                  
  36.              if(!empty($regArr))  
  37.              {  
  38.               
  39.                   $this->regArr = $regArr;  
  40.                  $this->regRange = $regRange;  
  41.                  $this->getList();  
  42.              }  
  43.                  
  44.          }  
  45.          function setQuery($regArr,$regRange='')  
  46.          {  
  47.              $this->jsonArr=array();  
  48.              $this->regArr = $regArr;  
  49.              $this->regRange = $regRange;  
  50.              $this->getList();  
  51.          }  
  52.         private function getList()  
  53.          {  
  54.           &amp

phpQuery占用过多内存的解决方法

 phpQuery是一个用php实现的类似jQuery的开源项目,可以在服务器端以jQuery的语法形式解析网页元素。 相对于正则或其它方式匹配网页方式,phpQuery使用起来要方便的多。

 
在使用phpQuery采集网页时,遇到一个问题:在处理大量网页之后,phpQuery占用的内存数量非常惊人(很快就超过了1G),
 
比如这段代码:
 
while (true) {
    phpQuery::newDocumentFile($htmlFile);
    // 处理网页元素…
    echo memory_get_usage() . "
";
}
谨慎运行上面这段代码,它会很快用光你的内存。
 
经过查看phpQuery的源代码终于发现了问题所在,phpQuery在每处理一个网页就会产生一个DOMDocumentWrapper 对象,而每个DOMDocumentWrapper 对象会被保存在静态成员$documents中(phpQuery::createDocumentWrapper中),这个变量是一个数组,每解析一个网页数组元素就增加一个。
 
phpQuery::$documents[$wrapper->id] = $wrapper;
 
找到问题后,解决就很容易了,每次解析完一个网页,把phpQuery::$documents置空即可。
 
while (true) {
    phpQuery::newDocumentFile($htmlFile);
    // 处理网页元素…
    phpQuery::$documents = array();//unset(phpQuery::$documents);
    echo memory_get_usage() . "
";
}
内存占用稳定了。

CI重写规则导致404错误,硬伤啊

   最近公司的新项目在做整合,几个频道原来是不同的域名不同的站点都是独立的文件夹,现在要公用Application目录和CI库目录等文件夹,为了便于管理与避免冲突,控制器controllers文件夹里各频道的控制器分别放在一个子目录里。为了让原来的访问地址一样有效,得重写.htaccess里的RewriteRule规则。

  原来的规则:RewriteRule ^(.*)$ /index.php/$1 [L]     #隐藏了index.php

  控制器转移到了user目录里,由于我想当然地在规则里直接加上了user:

  RewriteRule ^(.*)$ /index.php/user/$1 [L]

  可是访问时出现了404错误,访问/index.php/user/controller这样的网址又是正常的。

  经过解读CI代码,发现了造成这个问题的原因:非参数方式传递控制器名等信息时,获取URI数据是从当前链接获取的,而非重写后的,导致文件夹数据丢失。

  后经CI交流群Hex提醒,在config/routes.php里设置了路由,解决了:

$route['(S+)']="user/$1";

 

 

PHP里SERVER环境变量的几个重要元素

   $_SERVER 是一个包含了诸如头信息(header)、路径(path)、以及脚本位置(script locations)等等信息的数组。这个数组中的项目由 Web 服务器创建。不能保证每个服务器都提供全部项目;服务器可能会忽略一些,或者提供一些没有在这里列举出来的项目。这也就意味着大量的此类变量都会在<a href="http://www.faqs.org/rfcs/rfc3875" target="_blank">CGI 1.1 规范</a>中说明,所以应该仔细研究一下。

 
  1、$_SERVER["HTTP_HOST"]
  当前访问的域名,当端口号非80时会带上端口号。
 
  2、$_SERVER["SERVER_NAME"]
  手册里说:如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。 
  一般是输出当前访问的域名,不带端口号。网上有文章说(作者说经过测试):“默认情况下直接输出apache的配置文件httpd.conf中的ServerName值”。可是我测试时发现并非这样,依旧只是输出访问的域名。我的环境:Win7+Apache2.2.8+PHP5.4.23
 
  3、$_SERVER["REDIRECT_STATUS"]:当使用重定向时,能获取到这个元素的值。这个在多个错误页面指向同个页面的时候很有用,如:
文件:.htaccess
# .htaccess file.
 
ErrorDocument 404 /error-msg.php
ErrorDocument 500 /error-msg.php
ErrorDocument 400 /error-msg.php
ErrorDocument 401 /error-msg.php
ErrorDocument 403 /error-msg.php
# End of file.
 
文件: error-msg.php
<?php
$HttpStatus = $_SERVER["REDIRECT_STATUS"] ;
if($HttpStatus==200) {
    #some code
}
if($HttpStatus==400) {print "Bad HTTP request ";}
if($HttpStatus==401) {print "Unauthorized – Iinvalid password";}
if($HttpStatus==403) {print "Forbidden";}
if($HttpStatus==500) {print "Internal Server Error";}
if($HttpStatus==404) {print "404. Not found.";}
 
?> 
 
  4、$_SERVER["HTTP_USER_AGENT"]
  当前请求头中 User-Agent: 项的内容,如果存在的话。该字符串表明了访问该页面的用户代理的信息,也就是客户端浏览器的一些信息,可以通过 get_browser() 来获取更详细的信息
 
  5、$_SERVER["SERVER_ADDR"]
  浏览当前页面的用户的 IP 地址
 
  6、$_SERVER["REMOTE_ADDR"]
  服务器IP地址
 
  7、$_SERVER["DOCUMENT_ROOT"]
  站点根目录
 
  8、$_SERVER["SCRIPT_FILENAME"]
  当前访问页面的完整磁盘文件路径
 
  9、$_SERVER["REQUEST_TIME"]
  请求开始时的时间戳。从 PHP 5.1.0 起可用,REQUEST_TIME_FLOAT则能获取精确到小数点后两位的值
 
  10、$_SERVER["QUERY_STRING"]
  查询字符串,俗称的参数,即网址里第一个问号后面的字符串。
 
  11、$_SERVER["REQUEST_URI"]
  网址里域名后开始的字符串,包括第一个斜杠/
 
  12、$_SERVER["SCRIPT_NAME"]
  当前脚本的路径与名称,相对于站点根目录,当需要指向当前页面时,此数据非常有用。
 
  13、$_SERVER["PHP_SELF"]
  网址中域名后第一个问号前的字符串
 
  14、$_SERVER["HTTP_REFERER"]
  引导用户代理到当前页的前一页的地址(如果存在)。由 user agent 设置决定。并不是所有的用户代理都会设置该项,有的还提供了修改 HTTP_REFERER 的功能。简言之,该值并不可信。
 
  15、$_SERVER["argv"]
  传递给该脚本的参数的数组。

Yslow 之 高性能网站建设指南(High.Performance.Web.Sites)

 YSLOW 只是 Yahoo 前端发布的一个评测网站前端质量的插件。它的原理是基于 Yahoo 前端工程师提出来的优化方案。关于YSlow的详细解释网上资料大都不详尽,而且说法有多偏差。

 

[高性能网站建设指南——前端工程师技能精粹(英文原版)].O_Reilly.High.Performance.Web.Sites

 

YSlow 的权威解释可以参照书籍《High Performance Web Sites》O’Reilly出版的。

 

电子工业出版社翻译了这本书,中文名叫《高性能网站建设指南》,想深入研究高性能网站建设的前端工程师可以看看。这本书纸质版的就二十几块钱。只有扫描版的电子版,貌似还不太清晰。

 

[高性能网站建设指南——前端工程师技能精粹(英文原版)].O_Reilly.High.Performance.Web.Sites

 

 

推荐 30 款最好的免费项目管理软件

本文向你推荐30款免费的项目管理软件,其中有些是桌面应用,还有一些基于Web的平台,其中不乏优秀开源软件。

TeamLab

TeamLab 是一个免费开源的商业协作和项目管理的平台。TeamLab 主要功能包括:项目管理、里程碑管理、任务、报表、事件、博客、论坛、书签、Wiki、即时消息等等。

XPlanner+

XPlanner是专门为XP(极限编程)团队设计的项目管理工具

 

NavalPlan

NavalPlan是一个基于ZK框架开发Web的项目规划,监测和控制软件。

2-plan

2-plan 同时包含了桌面端和Web应用平台,桌面端是一个用来替代微软的 Project 软件的产品;而Web平台则提供基于Web 的项目管理平台。

WhoDoes

WhoDoes, 是一个基于Web 的项目管理工具,主要适合各种复杂度的项目规划,可用来管理每天的项目事务、任务分配、时间安排,并对进度进行跟踪。

Collabtive

Collabtive是一个基于Web的项目管理系统。提供的功能包括:项目管理,即时聊天工具,任务、文件管理,时间跟踪,多语言支持。

  • 简单易用
  • 能管理项目、里程碑、任务
  • 基线导入
  • 时间跟踪
  • 多语言支持

 

dotProject

DotProject是一个基于Web的项目管理工具,采用 PHP 开发。它包含的模块有:公司管理,项目管理,任务进度跟踪(运用甘特图),论坛,文件管理,日历,通信 录,备忘录/帮助桌面,用户与模块的权限管理,主题管理。DotProject已被翻译成17种语言并采用模块化设计以便于扩展。

jxProject

jxProject 是一个免费的桌面项目管理工具,支持 Windows、Linux、Solaris 以及 Mac OS X 系统,主要功能包括:时间轴、甘特图、资源分配、任务管理等等。

PHProjekt

PHProjekt是一个模块化的协同办公系统用于共享信息和文档。它包括的组件有:团队日历,Time Card系统,项目管理,请求跟踪,文档管理, 通讯录管理,Email客户端,论坛,聊天,记事本,共享书签,待办事项目列表,投票系统等。PHProjekt支持多种协议如 ldap,xml/soap和webdav并已经被翻译成36种语言。此外它支持7种数据库包括 MySQL,Postgres,Interbase,Oracle,Informix和MS-SQL。

Gantt Project

Gantt Project 是一个使用 GPL 授权的开源项目管理软件,采用 Java 开发的桌面管理工具,支持 Windows、Linux 和 Mac OS X 系统,适合小型项目团队,包含进度管理和项目经理顾问功能。

ProjectPier

ProjectPier 是一款开源的项目管理程序,基于 PHP+MySQL 架构。用户可以通过 ProjectPier 的 web 界面对任务、项目和团队进行管理。ProjectPier 支持多项目和多团队,它帮助团队进行沟通与协作,并通过任务设置、讨论版、里程碑、站内信息等功能使得项目管理更加透明和简单。

qdPM

qdPM是一个开源的项目管理系统,基于Symfony框架+PHP/MySQL开发。它支持为项目、任务、用户添加额外的字段,方便定制满足实际需求的系统。该还支持多种语言,默认已经提供多种语言文件。

 

Project HQ

Project HQ 是一个协作式的开源项目管理软件,类似 Basec

apache做反向代理抓后台的iis

1、Apache加载代理模块
httpd.conf
 
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
LoadModule proxy_connect_module modules/mod_proxy_connect.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
 
2、Apache站点配置
httpd-vhosts.conf
 
NameVirtualHost 192.168.0.22:80
 
<VirtualHost www.xxx.cn>
    ServerAdmin xxx@xxx.com
    ProxyPass / http://192.168.0.22:81/
    
    SetEnv force-proxy-request-1.0 1
    SetEnv proxy-nokeepalive 1
 
    ProxyPassReverse / http://192.168.0.22:81/
    ServerName www.ccc.cn
 
    ErrorLog logs/www.ccc.cn-error_log
    CustomLog logs/www.ccc.cn-access_log common
</VirtualHost>
 
 
前提
 
IIS   81 端口(或其它非80端口,Apache站点配置里代理抓取的端口与此一致)
apache2.2   80 端口
www.xxx.cn 域名指向 到 192.168.0.22
用户访问  www.xxx.cn 通过 apache 转向到 192.168.0.22 这个IP的 81端口,也就是 IIS服务。
若将 http://192.168.0.22:81改成网络上的其它存在的网站网址,则可代理访问该网站。