分类 PHP 下的文章

PHP 超时和http状态处理

首先是PHP的mysql的链接方式:

PHP与MySQL的连接有三种API接口,分别是:PHP的MySQL扩展 、PHP的mysqli扩展 、PHP数据对象(PDO) ,下面针对以上三种连接方式做下总结,以备在不同场景下选出最优方案。

PHP的MySQL扩展是设计开发允许php应用与MySQL数据库交互的早期扩展。MySQL扩展提供了一个面向过程的接口,并且是针对MySQL4.1.3或者更早版本设计的。因此这个扩展虽然可以与MySQL4.1.3或更新的数据库服务端进行交互,但并不支持后期MySQL服务端提供的一些特性。由于太古老,又不安全,所以已被后来的mysqli完全取代;

PHP的mysqli扩展,我们有时称之为MySQL增强扩展,可以用于使用 MySQL4.1.3或更新版本中新的高级特性。其特点为:面向对象接口 、prepared语句支持、多语句执行支持、事务支持 、增强的调试能力、嵌入式服务支持 、预处理方式完全解决了sql注入的问题。不过其也有缺点,就是只支持mysql数据库。如果你要是不操作其他的数据库,这无疑是最好的选择。

PDO是PHP Data Objects的缩写,是PHP应用中的一个数据库抽象层规范。PDO提供了一个统一的API接口可以使得你的PHP应用不去关心具体要连接的数据库服务器系统类型,也就是说,如果你使用PDO的API,可以在任何需要的时候无缝切换数据库服务器,比如从Oracle 到MySQL,仅仅需要修改很少的PHP代码。其功能类似于JDBC、ODBC、DBI之类接口。同样,其也解决了sql注入问题,有很好的安全性。不过他也有缺点,某些多语句执行查询不支持(不过该情况很少)。

官文对于三者之间也做了列表性的比较:
20180815163422.jpg

PDO设置超时和持久化链接的方法:

    PDO::ATTR_CASE              => PDO::CASE_NATURAL, //大小写
    PDO::ATTR_ERRMODE           => PDO::ERRMODE_EXCEPTION,//错误处理
    PDO::ATTR_ORACLE_NULLS      => PDO::NULL_NATURAL,//空转换为mysql的 null
    PDO::ATTR_STRINGIFY_FETCHES => false, //字符类型转换
    PDO::ATTR_EMULATE_PREPARES  => false,
    PDO::ATTR_TIMEOUT => 30,//链接超时时间
    PDO::ATTR_PERSISTENT => true //持久化链接

查询mysql设置的各种超时参数:show global variables like “%timeout%”;
PHP高版本对mysql扩展操作php已经不在进行维护,会出现各种问题,链接阻塞等.


PHP的fast-cgi配置:

p

m = dynamic #对于专用服务器,pm可以设置为static。 #如何控制子进程,选项有static和dynamic。如果选择static,则由pm.max_children指定固定的子进程数。
如果选择dynamic,则由下开参数决定: 
pm.max_children #,子进程最大数 
pm.start_servers #,启动时的进程数 
pm.min_spare_servers #,保证空闲进程数最小值,如果空闲进程小于此值,则创建新的子进程               pm.max_spare_servers #,保证空闲进程数最大值,如果空闲进程大于此值,此进行清理 
pm.max_requests = 1000 #设置每个子进程重生之前服务的请求数. 对于可能存在内存泄漏的第三方模块来说是非常有用的. 如果设置为 ’0′ 则一直接受请求. 等同于 PHP_FCGI_MAX_REQUESTS 环境变量. 默认值: 0. 

下面4个参数的意思分别为: 
pm.max_children:静态方式下开启的php-fpm进程数量 
pm.start_servers:动态方式下的起始php-fpm进程数量 
pm.min_spare_servers:动态方式下的最小php-fpm进程数 
pm.max_spare_servers:动态方式下的最大php-fpm进程数量 
区别: 
如果dm设置为 static,那么其实只有pm.max_children这个参数生效。系统会开启设置数量的php-fpm进程。
如果dm设置为 dynamic,那么pm.max_children参数失效,后面3个参数生效。 
系统会在php-fpm运行开始 的时候启动pm.start_servers个php-fpm进程, 然后根据系统的需求动态在pm.min_spare_servers和pm.max_spare_servers之间调整php-fpm进程数 

根据自己的服务器进行进程优化,启动个数不宜太大或者太小.

php + nginx 做反向代理设置:

fastcgi_connct_timeout 60

Nginx和fastcgi进程建立连接的超时时间,默认60秒,如果超过了这个时间就断开连接。

fastcgi_read_timeout 300

和fastcgi进程建立连接后获得fastcgi进程响应的超时时间,默认60秒,如果超过了这个时间都没有获得响应就断开连接。我们经常碰到的是'504 Gateway Time-out',就是因为后端连接没有在超时时间内返回数据导致的。我们经常碰到的是'502 Bad Gateway',是因为fastcig进程报错,导致连接断开。

fastcgi_send_timeout 300

Nginx向fastcgi进程发送请求的超时时间,默认60秒,如果超过了这个时间都没有发送完就断开连接。可以通过上传比较大的文件,就会出现超时,然后就会返回'504 Gateway Time-out'。

php之 curl :

curl_setopt($ch,opt)可以设置一些超时的设置
主要包括: *(重要)CURLOPT_TIMEOUT设置cURL允许执行的最长秒数。 
          *(重要)CURLOPT_TIMEOUT_MS设置cURL允许执行的最长毫秒数。(在cURL7.16.2中被加入。从PHP5.2.3起可使用。) 
          CURLOPT_CONNECTTIMEOUT在发起连接前等待的时间,如果设置为0,则无限等待。 
          CURLOPT_CONNECTTIMEOUT_MS尝试连接等待的时间,以毫秒为单位。如果设置为0,则无限等待。在cURL7.16.2中被加入。从PHP5.2.3开始可用。 
          CURLOPT_DNS_CACHE_TIMEOUT设置在内存中保存DNS信息的时间,默认为120秒。 

PHP 异常处理

PHP中什么是异常:
  程序在运行中出现不符合预期的情况,允许发生(你也不想让他出现不正常的情况)但他是一种不正常的情况,按照我们的正常逻辑本不该出的错误,但仍然会出现的错误,属于逻辑和业务流程的错误,而不是编译或者语法上的错误。

  PHP中什么是错误:
  属于php脚本自身的问题,大部分情况是由错误的语法,服务器环境导致,使得编译器无法通过检查,甚至无法运行的情况。warning、notice都是错误,只是他们的级别不同而已,并且错误是不能被try-catch捕获的。

**https://www.cnblogs.com/zyf-zhaoyafei/p/6928149.html**

Try, throw 和 catch简介:

Try - 使用异常的函数应该位于 "try" 代码块内。如果没有触发异常,则代码将照常继续执行。但是如果异常被触发,会抛出一个异常。
Throw - 这里规定如何触发异常。每一个 "throw" 必须对应至少一个 "catch"
Catch - "catch" 代码块会捕获异常,并创建一个包含异常信息的对象

设置顶级异常处理:set_exception_handler('myException');
创建自定义异常处理:创建自定义的异常处理程序,该类必须是 exception 类的一个扩展。

    Exception {
/* 属性 */
protected string $message ;
protected int $code ;
protected string $file ;
protected int $line ;
/* 方法 */
public __construct ([ string $message = "" [, int $code = 0 [, Throwable $previous = NULL ]]] )
final public string getMessage ( void )
final public Throwable getPrevious ( void )
final public int getCode ( void )
final public string getFile ( void )
final public int getLine ( void )
final public array getTrace ( void )
final public string getTraceAsString ( void )
public string __toString ( void )
final private void __clone ( void )
}

上为系统异常类的基础方法.

PHP 错误报警级别:

值 常量 描述
2 E_WARNING 非致命的 run-time 错误。不暂停脚本执行。
8 E_NOTICE Run-time 通知。脚本发现可能有错误发生,但也可能在脚本正常运行时发生。
256 E_USER_ERROR 致命的用户生成的错误。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_ERROR。
512 E_USER_WARNING 非致命的用户生成的警告。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_WARNING。
1024 E_USER_NOTICE 用户生成的通知。这类似于程序员使用 PHP 函数 trigger_error() 设置的 E_NOTICE。
4096 E_RECOVERABLE_ERROR 可捕获的致命错误。类似 E_ERROR,但可被用户定义的处理程序捕获。(参见 set_error_handler())
8191 E_ALL 所有错误和警告,除级别 E_STRICT 以外。(在 PHP 6.0,E_STRICT 是 E_ALL 的一部分)

PHP7 新特性

  1. 运算符(NULL 合并运算符)

$a = $_GET['a'] ?? 1;

相当于:

$a = isset($_GET['a']) ? $_GET['a'] : 1;

我们知道三元运算符是可以这样用的:

$a ?: 1

但是这是建立在 $a 已经定义了的前提上。新增的 ?? 运算符可以简化判断。

  1. 函数返回值类型声明

function arraysSum(array ...$arrays): array

{

  return array_map(function(array $array): int {

    return array_sum($array);

  }, $arrays);

}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

以上例程会输出:

Array
(

[0] => 6
[1] => 15
[2] => 24

)

强制模式:

function foo($a) : int

{

  return $a;

}

foo(1.0);

以上代码可以正常执行,foo 函数返回 int 1,没有任何错误。

严格模式:

declare(strict_types=1);

function foo($a) : int

{

  return $a;

}

foo(1.0);

PHP Fatal error: Uncaught TypeError: Return value of foo() must be of the type integer, float returned in test.php:6

在声明之后,就会触发致命错误。

  1. 标量类型声明

PHP 7 中的函数的形参类型声明可以是标量了。在 PHP 5 中只能是类名、接口、array 或者 callable (PHP 5.4,即可以是函数,包括匿名函数),现在也可以使用 string、int、float和 bool 了。

官方示例:

// Coercive mode

function sumOfInts(int ...$ints)

{

  return array_sum($ints);

}

var_dump(sumOfInts(2, '3', 4.1));

以上例程会输出:

int(9)
需要注意的是上文提到的严格模式的问题在这里同样适用:强制模式(默认,既强制类型转换)下还是会对不符合预期的参数进行强制类型转换,严格模式下则触发 TypeError 的致命错误。

  1. use 批量声明

PHP 7 中 use 可以在一句话中声明多个类或函数或 const 了:

use some/namespace/{ClassA, ClassB, ClassC as C};

use function some/namespace/{fn_a, fn_b, fn_c};

use const some/namespace/{ConstA, ConstB, ConstC};

但还是要写出每个类或函数或 const 的名称(并没有像 python 一样的 from some import * 的方法)。

需要留意的问题是:如果你使用的是基于 composer 和 PSR-4 的框架,这种写法是否能成功的加载类文件?其实是可以的,composer 注册的自动加载方法是在类被调用的时候根据类的命名空间去查找位置,这种写法对其没有影响。

  1. 太空舱操作符(组合比较操作符)

太空船操作符用于比较两个表达式。当$a小于、等于或大于$b时它分别返回-1、0或1。 比较的原则是沿用 PHP 的常规比较规则进行的。

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Floats
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1

// Strings
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1

  1. 通过 define() 定义常量数组

Array 类型的常量现在可以通过 define() 来定义。在 PHP5.6 中仅能通过 const 定义。

define('ANIMALS', [

'dog',
'cat',
'bird'

]);

echo ANIMALS[1]; // outputs "cat"
?>

  1. 迭代器

通过添加 yield 关键字支持了 generators,Generators 提供了一个更简单的方法实现迭代器,不需要实现 Iterator 接口

$gen = (function() {

yield 1;
yield 2;

return 3;

})();

foreach ($gen as $val) {

echo $val, PHP_EOL;

}

echo $gen->getReturn(), PHP_EOL;

以上例程会输出:

1
2
3

  1. 匿名类

现在支持通过new class 来实例化一个匿名类,这可以用来替代一些“用后即焚”的完整类定义。

interface Logger {

public function log(string $msg);

}

class Application {

private $logger;

public function getLogger(): Logger {
     return $this->logger;
}

public function setLogger(Logger $logger) {
     $this->logger = $logger;
}

}

$app = new Application;
$app->setLogger(new class implements Logger {

public function log(string $msg) {
    echo $msg;
}

});

var_dump($app->getLogger());
以上例程会输出:

object(class@anonymous)#2 (0) {
}

详细文档可以参考 匿名类.

  1. 闭包 Closure::call()

Closure::call() 现在有着更好的性能,简短干练的暂时绑定一个方法到对象上闭包并调用它。

class A {private $x = 1;}

// Pre PHP 7 code
$getXCB = function() {return $this->x;};
$getX = $getXCB->bindTo(new A, 'A'); // intermediate closure
echo $getX();

// PHP 7+ code
$getX = function() {return $this->x;};
echo $getX->call(new A);

以上例程会输出:

1
1

CGI、FastCGI和PHP-FPM关系图解[转]

806469-20160927081043813-1021846367.png
806469-20160927081047438-329876066.png

当Web Server收到 index.php 这个请求后,会启动对应的 CGI 程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以规定CGI规定的格式返回处理后的结果,退出进程,Web server再把结果返回给浏览器。这就是一个完整的动态PHP Web访问流程,接下来再引出这些概念,就好理解多了.

CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。
FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。同样,SCGI 协议与 FastCGI 类似。
PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。
PHP-FPM:是 PHP(Web Application)对 Web Server 提供的 FastCGI 协议的接口程序,额外还提供了相对智能一些任务管理。
Web Server: 一般指Apache、Nginx、IIS、Lighttpd、Tomcat等服务器,
Web Application: 一般指PHP、Java、Asp.net等应用程序。
806469-20160927081051563-2122907811

Web Server启动时载入FastCGI进程管理器(Apache Module或IIS ISAPI等)
FastCGI进程管理器自身初始化,启动多个CGI解释器进程(可建多个php-cgi),并等待来自Web Server的连接。
当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。
FastCGI子进程完成处理后,将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待,并处理来自FastCGI进程管理器(运行在Web Server中)的下一个连接。 在CGI模式中,php-cgi在此便退出了。
FastCGI与CGI特点:

对于CGI来说,每一个Web请求PHP都必须重新解析php.ini、重新载入全部扩展,并重初始化全部数据结构。而使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。
由于FastCGI是多进程,所以比CGI多线程消耗更多的服务器内存,php-cgi解释器每进程消耗7至25兆内存,将这个数字乘以50或100就是很大的内存数。
806469-20160927081052328-1825068850.png

1、CGI是公共网关接口,是HTTP服务与其它程序“交谈”的工具。
2、fastcgi是一个常驻行 CGI ,是CGI的一个扩展,让CGI解释器常驻内存,提供性能。
3、php-cgi是fastcgi的php版本。
4、php-fpm是php-cgi的管理器,能够实现平滑更改php.ini的配置。

转载

PHP 插件扩展大全


国外程序员整理的 PHP 资源大全



ziadoz 在 Github 发起维护的一个 PHP 资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等。



依赖管理



依赖和包管理库



Composer/Packagist:一个包和依赖管理器



Composer Installers:一个多框架Composer库安装器



Pickle:一个PHP扩展安装器







其他的依赖管理



其他的相关依赖管理



Satis:一个静态Composer存储库生成器



Composition:一个在运行时检查Composer环境的库



Version:语义版本的解析和比较库



NameSpacer -转化下划线到命名空间的库



Patch Installer -使用Composer安装补丁的库



Composer Checker -校验Composer配置的工具







框架



Web开发框架



Symfony2 -一个独立组件组成的框架



-另一个由独立组件组成的框架



Laravel 4 -另一个PHP框架



Aura PHP -独立组件的框架



Yii2 – 另一个PHP框架



Nette – 另一个由个体组件组成的框架



PPI fr<x>amework 2 -一个互操作性框架



Phalcon -通过C扩展实现的框架







其他框架



其他Web开发框架



Symfony CMF – 创建自定义CMS的内容管理框架



Knp RAD Bundle -Symfony 2的快速应用程序(RAD)包







框架组件



来自web开发框架的独立组件



Symfony2 Components -Symfony2组件



-ZF2组件



Aura Components -PHP5.4组件包



Hoa Project -另一个PHP组件包







微型框架



微型框架和路由



Silex – 基于Symfony2组件的微型框架



– 另一个简单的微型框架



Bullet PHP -用于构建REST APIs的微型框架



Fast Route – 快速路由库



Pux -另一个快速路由库







其他微型框架



其他相关的微型框架和路由



Silex Skeleton -Silex的项目架构



Silex Web Profiler -Silex web调试工具条



Stack – Silex/Symfony的可堆叠中间件库



Slim Skeleton -Slim架构



Slim View -Slim的自定义视图集合



Slim Middleware -Slim的自定义中间件集合







模板



模板化和词法分析的库和工具



Twig -一个全面的模板语言



Twig Cache Extension -一个用于Twig的模板片段缓存库



Mustache -一个Mustache模板语言的PHP实现



Phly Mustache -另一个Mustache模板语言的PHP实现



MtHaml – 一个HAML 模板语言的PHP实现



PHPTAL -一个 TAL 模板语言的PHP实现



Plates -一个原生PHP模板



Lex -一个轻量级模板解析器







静态站点生成器



预处理工具来生成web页面的内容。



Sculpin -转换Markdown和Twig为静态HTML的工具



Phrozn – 另一个转换Textile,Markdown和Twig为HTML的工具







HTTP



用于HTTP和网站爬取的库



Guzzle -一个全面的HTTP客户端



Buzz -另一个HTTP客户端



Requests -一个简单的HTTP库



HTTPFul -一个链式HTTP库



Goutte -一个简单的web爬取器



PHP VCR -录制和重放HTTP请求的库







URL



解析URL的库



Purl -一个URL处理库



PHP Domain Parser -一个本地前缀解析库







Email



发送和解析邮件的库



SwiftMailer – 一个邮件解决方案



PHPMailer – 另一个邮件解决方案



Fetch -一个IMAP库



Email Reply Parser -一个邮件回复解析库



Stampie -邮件服务库,不如 SendGrid, PostMark, MailGunMandrill.



-一个在邮件模板内联CSS的库







文件



文件处理和MIME类型检测库



Gaufrette -一个文件系统抽象层



Flysystem – 另一个文件系统抽象层



Canal -一个检测互联网媒体类型的库



Apache MIME Types -一个解析Apache MIME类型的库



Ferret – 一个MIME检测库



Hoa Mime -另一个MIME检测库



Lurker -一个资源跟踪库



PHP File Locator -一个在大型项目定位文件的库



PHP FFmpeg -一个用于FFmpeg 视频包装的库.



CSV – 一个CSV数据处理库







Streams 流



处理流的库



Streamer – 一个面向对象的流包装库







Dependency Injection依赖注入



实现依赖注入设计模式的库



Pimple – 一个小的依赖注入容器



Auryn – 另一个依赖注入容器



Orno Di -另一个可伸缩的依赖注入容器



PHP DI -一个使用注释实现的依赖注入



Acclimate -一个依赖注入容器和服务定位的通用接口







Imagery 图像



处理图像的库



Imagine -一个图像处理库



PHP Image Workshop -另一个图像处理库



Intervention Image -另一个图像处理库



-一个提取GIF动画帧信息的库



GIF Creator – 一个通过多张图片创建GIF动画的库



Image With Text -一个在图像中嵌入文本的库



Color Extractor -一个从图像中提取颜色的库







Testing 测试



测试代码和生成测试数据的库



PHPUnit -一个单元测试框架



DBUnit -PHPUnit的数据库测试库



ParaTest – PHPUnit的并行测试库



PHPSpec -基于功能点设计的单元测试库



Codeception -一个全栈测试框架



AspectMock – PHPUnit/ Codeception 模拟框架。



Atoum -一个简单的测试库



Mockery -一个用测试的模拟对象库



Phake -另一个用测试的模拟对象库



Prophecy -一个可选度很高的模拟框架



Faker -一个伪数据生成库



Samsui – 另一个伪数据生成库



Alice -富有表现力的一代库



Behat -一个行为驱动开发(BDD)测试框架



Pho -一个行为驱动开发测试框架



Mink -Web验收测试



HTTP Mock – 一个在单元测试模拟HTTP请求的库



VFS Stream -一个用于测试的虚拟文件系统流的包装器



VFS -另一个用于测试虚拟文件系统



Locust -一个用Python编写的现代加载测试库







Continuous Integration 持续集成



持续集成的库和应用



Travis CI – 一个持续集成平台



PHPCI -一个PHP的开源持续集成平台



Sismo – 一个持续测试服务库



Jenkins一个 PHP 支持的持续集成平台



JoliCi – 一个用PHP编写的由Docker支持的持续集成客户端







Documentation 文档



生成项目文档的库



Sami -一个API文档生成器



APIGen -另一个API文档生成器



PHP Documentor 2 -一个API文档生成器



phpDox – 一个PHP项目的文档生成器(不限于API文档)







Security 安全



生成安全的随机数,加密数据,扫描漏洞的库



HTML Purifier -一个兼容标准的HTML过滤器



RandomLib -一个生成随机数和字符串的库



True Random -使用 www.random.org生成随机数的库



SecurityMultiTool -一个PHP安全库



PHPSecLib -一个纯PHP安全通信库



TCrypto -一个简单的键值加密存储库



PHP IDS – 一个结构化的PHP安全层



PHP SSH -一个试验的面向对象的SSH包装库



IniScan -一个扫描PHP INI文件安全的库



SensioLabs Security Check -一个为检查Composer依赖提供安全建议的web工具



Zed – 一个集成的web应用渗透测试工具







Passwords 密码



处理和存储密码的库和工具



Password Compat -一个新的PHP5.5密码函数的兼容库



phpass – 一个便携式的密码哈希框架



PHP Password Lib -一个生成和校验密码的库



Password Policy – 一个PHP和ja<x>vasc<x>ript的密码策略库



Password Validator – 校验和升级密码哈希的库



Zxcvbn PHP -一个基于Zxcvbn JS的现实的PHP密码强度估计库







Code Analysis 代码分析



分析,解析和处理代码库的库的工具



PHP Parser -一个PHP编写的PHP解析器



PHPPHP – 一个PHP实现的PHP虚拟机



PHPSandbox -一个PHP沙盒环境



Dissect -一个词法和语法分析的工具集合



PHP Mess Detector -一个扫描代码缺陷,次优代码,未使用的参数等等的库。



PHP Code Sniffer -一个检测PHP、CSS和JS代码标准冲突的库



PHPCPD – 一个检测复制和粘贴代码的库



PHP Analyser -一个分析PHP代码查找缺陷和错误的库



PHP CS Fixer – 一个编码标准库



PHP Manipulator -一个分析和修改PHP源代码的库



PHP Metrics -一个静态测量库



PHP Refactoring Browser -一个重构PHP代码的命令行工具集



UBench – 一个简单的微型基准检测库



Athletic -一个基于注释的基准检测库



Mondrian – 使用使用图论的代码分析工具



Scrutinizer -一个审查PHP代码的web工具



PHPLOC -一个快速测量PHP项目大小的工具



xHprof -另一个PHP分析工具



-一个帮助遵守特定的编码惯例的工具。







Debugging 调试



调试代码的库和工具



xDebug -一个调试和分析PHP的工具



PHP Debug Bar – 一个调试工具栏



PHP Console -一个web调试控制台



Barbushin PHP Console -另一个使用Google Chrome的web调试控制台



PHPDBG – 一个交互的PHP调试器



Tracy -一个简单的错误检测,写日志和时间测量库







Build Tools 构建工具



项目构建和自动化工具



Go -一个简单的PHP构建工具



Bob – 一个简单的项目自动化工具



Phake -一个PHP克隆库



Box – 一个构建PHAR文件的工具



Phing -一个灵感来自于Apache Ant的PHP项目构建系统







Task Runners 任务运行器



自动运行任务的库



Task -一个灵感来源于Grunt和Gulp的纯PHP任务运行器



Robo -一个面向对象配置的PHP任务运行器



Bldr -一个构建在Symfony组件上的PHP任务运行器







Navigation导航



构建导航结构的工具



KnpMenu – 一个菜单库



Cartographer -一个站点地图生成库







Asset Management 资源管理



管理,压缩和最小化web站点资源的工具



Assetic – 一个资源管理的管道库



Pipe -另一个资源管理的管道库



Munee -一个资源优化库



JShrink -一个ja<x>vasc<x>ript最小化库



Puli – 一个检测资源绝对路径的库







Geolocation 地理位置



为地理编码地址和使用纬度经度的库。



GeoCoder -一个地理编码库



GeoTools -一个地理工具相关的库



PHPGeo -一个简单的地理库



GeoJSON -一个地理JSON的实现







Date and Time 日期和时间



处理日期和时间的库



Carbon – 一个简单的日期时间API扩展



ExpressiveDate -另一个日期时间API扩展



CalendR – 一个日历管理库







Event 事件



时间驱动或非阻塞事件循环实现的库



React -一个事件驱动的非阻塞I/O库



Rx.PHP – 一个reactive扩展库



Ratchet – 一个web套接字库



Hoa WebSocket -另一个web套接字库



Hoa EventSource -一个事件源库



Evenement -一个事件分发库



FuelPHP Event -另一个事件分发库







Logging 日志



生成和处理日志文件的库



Monolog – 一个全面的日志工具



KLogger -一个易用的PSR-3兼容的日志类







E-commerce 电子商务



处理支付和构建在线电子商务商店的库和应用



OmniPay -一个框架混合了多网关支付处理的库



Payum – 一个支付抽象库



Sylius – 一个开源的电子商务解决方案



Thelia -另一个开源的电子商务解决方案



Money – 一个Fowler金钱模式的PHP实现



Sebastian Money -另一个处理货币值的库



Swap -一个汇率库







PDF



处理PDF文件的库和软件



Snappy -一个PDF和图像生成器库



WKHTMLToPDF -一个将HTML转换为PDF的工具







Databa<x>se 数据库



使用对象关系映射(ORM)或数据映射技术的数据库交互库



Doctrine -一个全面的DBAL和ORM



Doctrine Extensions -一个Doctrine行为扩展的集合



Propel – 一个快速的ORM,迁移库和查询构架器



-Laravel 4 ORM



Baum -一个Eloquent的嵌套集实现



Spot2 -一个MySQL的ORM映射器



RedBean -一个轻量级,低配置的ORM



Pomm -一个PostgreSQL对象模型管理器



ProxyManager -一个为数据映射生成代理对象的工具集







Migrations 迁移



帮助管理数据库模式和迁移的库



PHPMig -另一个迁移管理库



Phinx – 另一个数据库迁移管理库



Migrations -一个迁移管理库



Doctrine Migrations -一个Doctrine迁移库







NoSQL



处理NoSQL后端的库



MongoQB -一个MongoDB查询构建库



Monga -一个MongoDB抽象库



Predis – 一个功能完整的Redis库







Queue 队列



处理事件和任务队列的库



Pheanstalk -一个Beanstalkd 客户端库



PHP AMQP -一个纯PHP AMQP库



Thumper – 一个RabbitMQ模式库



Bernard -一个多后端抽象库







Search 搜索



在数据上索引和执行查询的库和软件



ElasticSearch PHP -ElasticSearch的官方客户端库



Elastica -ElasticSearch的客户端库



Solarium -Solr的客户端库



SphinxQL query builder -Sphinx搜索引擎的的查询库







Command Line 命令行



构建命令行工具的库



Boris – 一个微型PHP REPL



PsySH – 另一个微型PHP REPL



Pecan -一个事件驱动和非阻塞内核



GetOpt – 一个命令行选择解析器



OptParse -另一个命令行选择解析器



Commando -另一个简单的命令行选择解析器



GetOptionKit -另一个命令行选择解析器



-计算cron运行日期的库



ShellWrap -一个简单的命令行包装库



Hoa Console -另一个命令行库



Shunt – 一个在多台远程机器上并行运行命令行的库



Cilex -一个构建命令行工具的微型框架







Authentication 身份验证



实现身份验证的库



Sentry -一个混合的身份验证和授权的框架库



Sentry Social -一个社交网络身份验证库



Opauth -一个多渠道的身份验证框架



OAuth2 -一个OAuth2身份验证服务,资源服务器和客户端库



OAuth2 Server -另一个OAuth2服务器实现



PHP oAuthLib -另一个OAuth库



TwitterOAuth -一个Twitter OAuth库



TwitterSDK -一个完全测试的Twitter SDK



Hawk -一个Hawk HTTP身份认证库



HybridAuth -一个开源的社交登陆库







Markup 标记



处理标记的库



Decoda -一个轻量级标记解析库



PHP Markdown -一个Markdown解析器



CommonMark PHP -一个对 CommonMark spec全支持的Markdown解析器



Dflydev Markdown -另一个Markdown解析器



Parsedown -另一个Markdown解析器



Ciconia – 另一个支持Github Markdown风格的Markdown解析器



Cebe Markdown -一个快速的可扩展的Markdown解析器



HTML5 PHP – 一个HTML5解析和序列化库







Strings 字符串



解析和处理字符串的库



ANSI to HTML5 -ANSI到HTML5的转化库



Patchwork UTF-8 -一个处理UTF-8字符串的便携库



Hoa String -另一个UTF-8字符串库



Stringy -一个多字节支持的字符串处理库



Color Jizz -处理和转换颜色的库



UUID – 生成UUIDs的库



Slugify -转换字符串到slug的库



Urlify – 一个Django的 URLify.jsPHP通道



Text – 一个文本处理库



SQL Formatter -一个格式化SQL语句的库



UA Parser – 一个解析用户代理字符串的库







Numbers 数字



处理数字的库



Numbers PHP -处理数字的库



Math -处理大数字的库



ByteUnits – 在二进制和度量系统中解析,格式化和转换字节单元的库



PHP Units of Measure -一个计量单位转换的库



PHP Conversion – 另一个计量单位转换的库



LibPhoneNumber for PHP -Google电话号码处理的PHP实现库







Filtering and Validation 过滤和验证



过滤和验证数据的库



Filterus – 一个简单的PHP过滤库



Respect Validate -一个简单的验证库



Valitron -另一个验证库



Upload – 一个处理文件上传和验证的库



DMS Filter – 一个注释过滤库



-一个支持YAML,JSON和xm<x>l的模式验证库



ISO-codes -验证各种ISO和ZIP编码的库(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN)







REST和API



开发REST-ful API的库和web工具



Apigility -一个使用Zend fr<x>amework 2构建的API构建器



Hateoas -一个HOATEOAS REST web服务库



HAL -一个超文本应用语言(HAL)构建库



Negotiation -一个内容协商库



Drest -一个将Doctrine实体暴露为REST资源节点的库



Restler -一个将PHP方法暴露为RESTful web API的轻量级框架







Caching 缓存



缓存数据的库



Alternative PHP Cache (APC) – 打开PHP伪代码缓存



Cache -一个缓存库(Doctrine部分)



Stash -另一个缓存库







数据结构和存储



实现数据结构和存储技术的库



Ardent -一个数据结构库



PHP Collections – 一个简单的集合库



Serializer -一个序列化和反序列化数据的库



-一个对象存储库



Fractal -一个转换复杂数据结构到JSON输出的库



Totem -一个管理和穿件数据交换集的库



PINQ -一个PHP实时Linq库



JsonMapper -一个将内嵌JSON结构映射为PHP类的库







Notifications 通知



处理通知软件的库



Nod -一个通知库(Growl等)



Notificato – 一个处理推送通知的库



Notification Pusher -一个设备推送通知的独立库



Notificator -一个轻量级的通知库







Deployment 部署



项目部署库



Pomander -一个PHP应用部署工具



Rocketeer -PHP世界里的一个快速简单的部署器



Envoy -一个用PHP运行SSH任务的工具



Plum – 一个部署库







国际化和本地化



国际化(I18n)和本地化(L10n)



Aura.Intl







第三方API



访问第三方API的库



Amazon Web Service SDK – PHP AWS SDK官方库



S3 Stream Wrapper -Amazon S3流包装库



Stripe -Stripe官方PHP库



Campaign Monitor -Campaign Monitor官方PHP库



Digital Ocean -Digital Ocean API 接口库



Github – Github API交互库



PHP Github API -另一个Github API交互库



Twitter OAuth -Twitter OAuth工作流交互库



Twitter REST – Twitter REST API交互库



Dropbox SDK – The official PHP Dropbox SDK library.



Dropbox SDK – Dropbox SDK官方PHP库



Twilio – The official Twilio PHP REST API.



Twilio – Twilio官方PHP REST API



Mailgun The official Mailgun PHP API.



Mailgun Mailgun官方PHP REST API







Extensions 扩展



帮组构建PHP扩展的库



Zephir -用于开发PHP扩展,且介于PHP和C++之间的编译语言



PHP CPP -一个开发PHP扩展的C++库







Miscellaneous 杂项



不在上面分类中的有用库和工具



Spork -一个处理forking的库



JSON Lint – 一个JSON lint工具



JSONPCallbackValidator -验证JSONP回调的库



Pagerfanta -一个分页库



Ruler – 一个简单的无状态的生产环境规则引擎。



LiteCQRS -一个CQRS(命令查询责任分离)库



Sslurp – 一个使得SSL处理减少的库



PHP Option一个可选的类型库



Metrics -一个简单的度量API库



– 一个解析VCard和iCalendar对象的库



Annotations -一个注释库(Doctrine部分)



Whoops -一个不错的错误处理库



Finite -一个简单的PHP有限状态机



LadyBug -一个dumper库



Procrastinator -运行耗时任务的库



Compose -一个功能组合库



SuperClosure -一个允许闭包序列化的库



Jumper – 一个远程服务执行库



Underscore -一个Undersccore JS库的PHP实现



PHP PassBook -一个iOS PassBook PHP库



-一个PHP表达式语言



RMT – 一个编写版本和发布软件的库



Wise – 一个配置管理器



Opengraph -一个开放图库



Essence -一个提取web媒体的库



Embera -一个Oem<x>bed消费库



Graphviz -一个图形库



Monad PHP 一个简单Monad库



Flux -一个正则表达式构建库



Patchwork – 一个重新定义用户的函数库



Galapagos -语言转换进化



Design Patterns PHP -一个使用PHP实现的设计模式存储库



PHPCR – 一个Java内容存储库(JCR)的PHP实现



Functional PHP – 一个函数式编程库



ClassPreloader – 一个优化自动加载的库



Lib Country -一个国家和地区数据的库



Lib Accessor -一个简化访问的库



PHPStack -一个PHP编写的TCP/IP栈概念



Nmap -一个Nmap PHP包装器



Code Mover -一个移动代码的库



Iter -一个使用生成器提供迭代原语的库



Lambda PHP -一个PHP中的Lambda 计算解析器



Country List – 所有带有名称和ISO 3166-1编码的国家列表



PHP-GPIO – 用于Raspberry PI的GPIO pin的库



print_o – 一个对象图的可视化器



Alias -一个类别名库







Software 软件



创建一个开发环境的软件



PHP安装



在你的电脑上帮助安装和管理PHP的工具



HomeBrew -一个OSX包管理器



HomeBrew PHP -一个HomeBrew的PHP通道



PHP OSX – 一个OSX下的PHP安装器



PHP Brew -一个PHP版本管理和安装器



PHP Env – 另一个PHP版本管理器



PHP Switch – 另一个PHP版本管理器



PHP Build – 另一个PHP版本安装器



VirtPHP – 一个创建和管理独立PHP环境的工具







Development Environment 开发环境



创建沙盒开发环境的软件和工具



Vagrant -一个便携的开发环境工具



Ansible – 一个非常简单的编制框架



Puppet -一个服务器自动化框架和应用



PuPHPet -一个构建PHP开发虚拟机的web工具



Protobox -另一个构建PHP开发虚拟机的web工具



Phansible – 一个用Ansible构建PHP开发虚拟机的web工具







Virtual Machines 虚拟机



相关的PHP虚拟机



HipHop PHP -Facebook出品的PHP虚拟机,运行时和JIT



HippyVM -另一个PHP虚拟机



Hack – 一个PHP进行无缝操作的 HHVM编程语言



IDE 集成开发环境



支持PHP的集成开发环境



Netbeans -一个支持PHP和HTML5的IDE



Eclipse for PHP Developers -一个基于Eclipse平台的PHP IDE



PhpStorm -一个商业PHP IDE







Web Applications Web应用



基于Web的应用和工具



3V4L一个在线的PHP shell



DBV -一个数据库版本控制应用



PHP Queue -一个管理后端队列的应用



Composer as a Service – 作为一个zip文件下载Composer包的工具



MailCatcher – 一个抓取和查看邮件的web工具







Resources 资源



各种提高你的PHP开发技能和知识的资源,比如书籍,网站,文章



PHP网站



PHP相关的有用网站



PHP The Right Way -一个PHP最佳实践的快速指引手册



PHP Best Practices – 一个PHP最佳实践指南



PHP Weekly – 一个PHP新闻周刊



PHP Security – 一个PHP安全指南



PHP FIG – PHP框架交互组



PHP UG -一个帮助用户定位最近的PHP用户组(UG)的网站



Seven PHP -一个PHP社区成员采访的网站



Nomad PHP -一个在线PHP学习资源



PHP Mentoring -点对点PHP导师组织







Other Websites 其他网站



web开发相关的有用网站



The Open Web Application Security Project (OWASP) -一个开放软件安全社区



WebSec IO – 一个web安全社区资源



Web Advent -一个web开发人员日历



Semantic Versioning -一个解析语义版本的网站



Atlassian Git Tutorials -一个Git教程系列



Hg Init -一个Mercurial教程系列



Servers for Hackers – 一个关于服务器管理的新闻通讯



原文链接:http://www.kubiji.cn/topic-id2570.html

抽象类和接口

在开发的过程中或者在面试的过程中,总是会遇到这个问题,在自己的印象中还是比较模糊的,今天简单的写两条,这个网上也有很多,都大同小异。

抽象类

在声明类时有一个方法时抽象方法,那么这个类就是抽象类,抽象类要使用abstract关键字来修饰。
在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修饰为私有的。

<?php
    abstract class Person{
        protected $name;
        protected $country;
 
        function __construct($name="",$country="china"){
            $this ->name = $name;
            $this ->country = $country;
        }
 
        abstract function say();
        abstract function eat();
 
        function run(){
            echo "使用两条腿走路<br>";
        }
    }
?>

抽象类就像是一个“半成品”的类,在抽象类中有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就不能直接使用它。
当子类继承抽象类以后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也不能实例化对象。

接口

接口中声明的方法必须都是抽象方法,另外不能再接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中所有成员都必须有public的访问权限。

使用extends关键字让一个接口去继承另一个接口,实现接口之间的扩展。

通过类去继承接口时需要使用implements关键字来实现,而并不是使用extends关键字完成。

如果需要使用接口中的成员,则需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。

   <?php
      interface 接口名称{ //使用interface关键字声明接口
      常量成员 //接口中的成员属性只能是常量,不能是变量
      抽象方法 //接口中的所有方法必须是抽象方法,不能有非抽象的方法存在
      }
   ?>

<?php
interface one{
const CONSTANT = 'CONSTANT value';
function fun1();
function fun2();
}
 
//声明一个抽象类去实现接口One中的第二个方法
abstract class Three implements One{ //只实现接口中的一个抽象方法
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
//声明一个类实现接口One中的全部抽象方法
class Four implements One{
function fun1(){
//具体的实现内容由子类自己决定
}
 
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
?>

总结

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。