在项目中,经常需要保持长时间的连接,比如说接口,去获取某个外部接口的数据并进行处理的时候,可能由于该接口返回的数据量比较大,所以接口很容易就超时了(php.ini设置了连接的最大时间),为了避免超时,可以分批获取
当然,PHP也可以实现连接不断持续执行的,忽略php.ini的超时时间,
比如可以通过fastcgi_finish_request和set_time_limit(0)来实现:
<?php
// 设置时区
date_default_timezone_set('PRC');
// 避免超时报错
set_time_limit(0);
// 避免内存不足
ini_set('memory_limit', '-1');
// 该方法是FPM提供的方法,只能运行在FastCGI模式下,在CLI模式或者是模块模式等非FPM模式下的话,会报错的,需要加上以下代码才可以
if (!function_exists("fastcgi_finish_request")) {
function fastcgi_finish_request() {
}
}
// 响应完成, 关闭连接
fastcgi_finish_request();
$i = 1;
while (true) {
echo $i . ':当前时间为:' . date('Y-m-d H:i:s') . PHP_EOL;
sleep(10);
$i++;
}
同样,也可以使用Swoole或者是Workerman来实现
比如使用Workman的定时器来实现:
<?php
use Workerman\Worker;
use Workerman\Lib\Timer;
require_once 'Autoloader.php';
// 设置时区
date_default_timezone_set('PRC');
echo '开始了' . PHP_EOL;
function print_str($timer_id)
{
static $i = 1;
echo $i . ': 当前时间为:' . date('Y-m-d H:i:s') . PHP_EOL;
if ($i++ >= 10) {
echo '结束了' . PHP_EOL;
Timer::del($timer_id);
exit();
}
}
$task = new Worker();
$task->onWorkerStart = function($task)
{
// 每5秒执行一次
$time_interval = 5;
$timer_id = Timer::add($time_interval, 'print_str', [&$timer_id]);
};
// 运行worker
Worker::runAll();
// 这个并不会被打印出来
echo '这个是结束了嘛?' . PHP_EOL;