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 流机制可以通过 default_socket_timeout 指令来配置。
流是 PHP 中很重要的一个特性,以后可以说一说,简单的理解就是在 PHP 中,不管是读取磁盘文件、HTTP 接口,都可以认为是一种流(socket/stream)。

说明下, socket/stream 的等待时间是不包括在 PHP 最大执行时间内的。
比如说在 PHP.ini 中 配置 max_execution_time = 30,max_execution_time = 20,那么这个 PHP 程序最大处理执行时间是 50 秒。

现在重点来了,原来自己认为超时时间假如为 m 秒,那么访问接口最终响应(包括网络传输时间)超过 m 秒,调用程序就会报错。实际并不是这样,只要在 m 秒数据包一直在传输,那么调用程序就不会报错。

标签: PHP, MySql

评论已关闭