php怎么算是超时,PHP下载网络资源文件?
引言
在程序内下载资源文件,这本身就是一个充满了不确定因素的事情。可能会因为网络超时连接中断,或者程序故障抛出各种异常,在实际中我们一般要避免在程序流程中下载文件。
如果是实在无法避免,用什么办法比较高效呢?或者说比较轻量级呢?本文就来说一说。
最直接的办法就是使用内置函数 file_get_contents。参数形式如下:
int file_put_contents( string $filename, mixed $data[, int $flags = 0[, resource $context]] )
这个函数设计的很巧妙,兼容了很多场景下的使用。我们只需要按照相应的参数填入,就可以组装出各种各样的功能。
如果是下载资源,那么会分为两步。第一,把远程资源拿到本地。第二,把该资源写入本地文件。使用代码实现如下:
file_put_contents("Tmpfile.zip", fopen("http://someurl/file.zip", 'r'));
其中在位置参数 $data 的位置,传入了一个fopen生成的文件句柄。
根据函数手册上所说,如果$data 指定的是流,则该流的缓冲区将被复制到指定的文件。对标的函数是 stream_copy_to_stream。那样写起来就得是这样的:
是不是没有file_put_contents精简。难怪很多敲代码的老司机,习惯于使用这一个函数进行网络请求呢!
文件操作纯粹使用文件操作,也没有问题,使用PHP提供的 fopen fclose fwrite fread 等函数,完全可以胜任。我们将其封装为一个助手函数:
因为不能确定原始文件的长度,在读写的时候,需要注意缓存区的大小,分块读入和写入。其中参数 1024 * 8,指定每次读写 8K 字节。使用 feof 判断文件是否到尾部。
网络请求既然是网络资源文件,使用上面的函数,无非都要发起 HTTP 请求。既然是网络请求,何不把这个功能交给 cURL 呢?这样对于请求头,请求体,响应体等等全程 HTTP 环节,都可以在程序内操作,容错性肯定不差。
下面我们使用 cURL 库进行文件请求操作:
如果是小小的资源文件,下载起来不费时间,也不会阻碍接下来的流程。如果是超大文件,费时间,而且还可能中断,有没有断点续传?有没有自动压缩?这都是问题。
所以,使用网络请求下载大文件,这已经超出了 PHP 内置函数的范畴。我们需要功能更为强大的下载器,多资源,多线程,断线续传,自动重试。
写在最后本文通过3中方法对比了实现小文件下载的功能,各有优劣,根据不同的场景需要开发者做出适当的选择。
Happy coding :_)
我是 @程序员小助手 ,持续分享编程知识,欢迎关注。
MySQL连接超时自动断开连接应该怎样处理?
用Fsocket获取数据时能够控制超时的。如果用File_get_contents($url);可以临时设定环境变量:设定默认socket超时时间ini_set("default_socket_timeout",3);养成好习惯,使用fsocket获取数据。
如果使用Curl,也可以在Curl中控制超时时间:curl_setopt($ch,CURLOPT_TIMEOUT,15)
;PHP中mysql函数是不提供类似mysql超时选项的,但是php.ini的mysql.connect_timeout可设置;Maximumtime(inseconds)forconnecttimeout.-1meansnolimitmysql.connect_timeout=60也可以在php脚本中调用设置ini_set();
我手机上出504GatewayTime?
这是由于服务器端的配置出现了状况,平时也很少见到。具体解决办法就是修改配置文件:
1、把max_children由之前的10改为现在的30,这样就可以保证有充足的php-cgi进程可以被使用;把request_terminate_timeout由之前的0s改为60s,这样php-cgi进程处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。
2、接着再更改nginx的几个配置项,减少FastCGI的请求次数,尽量维持buffers不变:fastcgi_buffers由464k改为2256k;fastcgi_buffer_size由64k改为128K;fastcgi_busy_buffers_size由128K改为256K;fastcgi_temp_file_write_size由128K改为256K。
502错误是什么原因造成的?
原因分析:
将请求提交给网关如php-fpm执行,但是由于某些原因没有执行完毕导致php-fpm进程终止执行。那么出现问题的地方便与网关服务如php-fpm的配置有关。
max_children最大子进程数,在高并发请求下,达到php-fpm最大响应数,后续的请求就会出现502错误的。可以通过netstat命令来查看当前连接数。
request_terminate_timeout设置单个请求的超时终止时间。还应该注意到php.ini中的max_execution_time参数。当请求终止时,也会出现502错误的。
当积累了大量的php请求,此时重启php-fpm释放资源,但没有几分钟的时间,又再次出现502错误,为什么呢?此时我们还应考虑是否与数据库有关,查看下数据库进程是否有大量的locked进程,数据库死锁导致超时,前端终止了继续请求,但是SQL语句还在等待释放锁,这时就要重启数据库服务了或kill掉死锁SQL进程了。
远程服务器返回错误?
502错误原因分析:
1、这类错误常见于Nginx+PHP的Web架构,Nginx将请求提交给网关PHP-FPM执行,但是由于某些原因请求没有执行完毕导致PHP-FPM进程终止执行。说到此,这个问题就很明了了,与网关服务如PHP-FPM的配置有关了。
2、php-fpm.conf配置文件中有两个参数就需要你考虑到,分别是max_children和request_terminate_timeout。
3、max_children最大子进程数,在高并发请求下,达到php-fpm最大响应数,后续的请求就会出现502错误的。可以通过netstat命令来查看当前连接数。
4、request_terminate_timeout设置单个请求的超时终止时间。还应该注意到php.ini中的max_execution_time参数。当请求终止时,也会出现502错误的。
5、当积累了大量的php请求,你重启php-fpm释放资源,但一两分钟不到,502又再次呈现, 这时还应该考虑到数据库,查看下数据库进程是否有大量的locked进程,数据库死锁导致超时,前端终止了继续请求,但是SQL语句还在等待释放锁,这时就要重启数据库服务了或kill掉死锁SQL进程了。
6、所以在调整max_children和request_terminate_timeout、max_execution_time也需要考虑到服务器资源使用情况及应用代码sql执行效率情况,需要综合衡量。502 Bad Gateway:服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。 亦说Web服务器用作网关或代理服务器时收到了无效响应。远程服务器是成对设置的。 若要设置一对远程服务器,请将这两台服务器配置为彼此将对方识别为远程服务器。大多数情况下,不需要为远程服务器设置配置选项。 SQL Server 组将在本地计算机和远程计算机上设置默认值以允许远程服务器连接。为了能够进行远程访问,必须在本地和远程计算机上将 remote access 配置选项设置为 1。 (这是默认设置。)remote access 控制远程服务器的登录。 可以通过使用 Transact-SQL sp_configure 存储过程或 SQL Server Management Studio 重置此配置选项。 若要在 SQL Server Management Studio中设置选项,请在 “服务器属性连接” 页上,使用 “允许远程连接到此服务器”。 若要访问“服务器属性连接”页,请在对象资源管理器中右键单击服务器名称,再单击“属性”。 在 “服务器属性” 页上,单击 “连接” 页。在本地服务器中,您可以禁用远程服务器配置,以防止远程服务器中的用户对与其配对的本地服务器进行访问。