【保持连接】PHP保持连接不断持续执行【原创】

在项目中,经常需要保持长时间的连接,比如说接口,去获取某个外部接口的数据并进行处理的时候,可能由于该接口返回的数据量比较大,所以接口很容易就超时了(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;
发布了64 篇原创文章 · 获赞 47 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/jiandanokok/article/details/94659855