You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP CURL会话24小时过期:如何自动更新会话?

解决方案:PHP CURL自动更新24小时过期会话

核心问题分析

你的脚本依赖grpAct@Session Cookie维持会话,但该Cookie24小时后过期,导致脚本无法正常获取数据。解决关键是实现自动重新登录刷新会话的逻辑,而非单纯依赖旧Cookie。

具体实现步骤

1. 编写登录刷新会话函数

新增一个专门的登录函数,用于在会话过期时重新登录,更新Cookie文件中的会话信息:

function refreshActibiosSession($cookiePath) {
    $ch = curl_init();
    
    // 目标网站登录页URL(需确保为实际登录接口)
    curl_setopt($ch, CURLOPT_URL, 'https://actibios.com/WebForms/Login.aspx');
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    
    // 构造登录POST数据,替换为你的真实用户名和密码
    $loginPostData = http_build_query([
        'txtUser' => '你的账号',
        'txtPwd' => '你的密码',
        'btnLogin' => '登录'
    ]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $loginPostData);
    
    // 模拟浏览器请求头
    curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36');
    curl_setopt($ch, CURLOPT_REFERER, 'https://actibios.com/WebForms/Login.aspx');
    
    // 指定Cookie文件,覆盖旧的过期会话
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);
    
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    
    $result = curl_exec($ch);
    curl_close($ch);
    
    // 验证登录是否成功(可根据页面特征调整判断逻辑)
    return strpos($result, 'grpAct@User') !== false;
}

2. 在主脚本中加入会话检测与自动刷新

在执行数据获取逻辑前,先检查会话有效性,无效则自动触发登录刷新:

$cookiePath = $_SERVER['DOCUMENT_ROOT'].'/modules/heallyimport/cookie_actibios.txt';

// 先测试当前会话是否有效
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://actibios.com/WebForms/Clientes/GenerarPedidosVentas_new.aspx');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36');
$testResult = curl_exec($ch);
curl_close($ch);

// 检测是否出现会话过期提示(替换为网站实际的过期关键词)
if (strpos($testResult, '会话过期') !== false || strpos($testResult, '请重新登录') !== false) {
    // 尝试刷新会话
    if (!refreshActibiosSession($cookiePath)) {
        die('登录失败,无法更新会话');
    }
}

// 以下为原数据获取逻辑
$ch = curl_init();
$post_field = 'ajax=SearchArticulo&cntrSgn=DeExMEkRabGEO396gOLDMqUZiXe2BibRjqgUXwZlQmMgrw4jJmdAwbUD11%2BddBhn&srcInicio=false&isSimple=false&codMarca=0&field=nombre&value=&oferta=false&pvpSubido=False&detallada=false&codPedido=';
$post_field .= '&cat1=5&cat2=65&cat3=363&token=';
curl_setopt($ch, CURLOPT_URL, 'https://actibios.com/WebForms/Clientes/GenerarPedidosVentas_new.aspx');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_field);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.0.0 Safari/537.36');
curl_setopt ($ch, CURLOPT_REFERER, 'https://actibios.com/WebForms/Clientes/GenerarPedidosVentas_new.aspx');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);
curl_setopt($ch, CURLOPT_VERBOSE, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
    'Connection: Keep-Alive'
));
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
$result = curl_exec($ch);
if (curl_errno($ch)) {
    echo 'Error:' . curl_error($ch);
}
$dom = new DOMDocument();
$dom->loadHTML($result);
$tables = $dom->getElementsByTagName('table');
$table_array = array();
foreach ($tables as $table) {
    $rows = $table->getElementsByTagName('tr');
    foreach ($rows as $row) {
        $cols = $row->getElementsByTagName('td');
        $row_array = array();
        foreach ($cols as $col) {
            $row_array[] = $col->nodeValue;
        }
        $table_array[] = $row_array;
    }
}

$products = [];
foreach ($table_array as &$item) {
    curl_setopt($ch, CURLOPT_URL, 'https://actibios.com/WebForms/Clientes/Indicacion.aspx?cp='.$item[0]);
    curl_setopt($ch, CURLOPT_POSTFIELDS, "ajax=GetIndicacion&codArticulo=".$item[0]);
    curl_setopt($ch, CURLOPT_COOKIEJAR, $cookiePath);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookiePath);
    curl_setopt ($ch, CURLOPT_REFERER, 'https://actibios.com/WebForms/Clientes/GenerarPedidosVentas_new.aspx');
    curl_setopt($ch, CURLOPT_VERBOSE, true);
    curl_setopt($ch, CURLOPT_COOKIESESSION, false);
    $page_content = preg_replace('/<(pre)(?:(?!<\/\1).)*?<\/\1>/s','',curl_exec($ch));
    $desc = explode(':',$page_content);

    $description = str_replace(",'marca'","",$desc[3]);
    $description = str_replace("'", "", $description);
    $name = str_replace("\xc2\xa0",' ',$item[1]);
    $name = trim($name);

    $products[] = [
        'ref' => $item[0],
        'name' => $name,
        'cat1' => 'COSMÉTICA E HIGIENE',
        'cat2' => 'Salud bucodental',
        'cat3' => 'Hilo dental e interdentales',
        'image' => 'https://actibios.com/WebForms/Controls/imgArticulo.aspx?ca='.$item[0],
        'stock' => $item[5],
        'desc' => $description,
        'brand' => $item[2],
        'price1' => floatval($item[6]),
        'price2' => floatval($item[7])
    ];
    unset($item[8]);
    unset($item[9]);
    unset($item[10]);
}
echo json_encode($products);
curl_close($ch);

3. 额外优化建议

  • 定时提前刷新:如果脚本通过CRON定时执行,可设置每23小时执行一次登录刷新,提前更新会话,避免过期中断。
  • Cookie文件权限:确保cookie_actibios.txt文件具备读写权限,否则CURL无法更新Cookie内容。
  • 适配登录表单字段:部分网站登录页会包含__VIEWSTATE、__EVENTVALIDATION等隐藏字段,需先GET登录页面获取这些字段,再构造完整的POST登录数据。

内容的提问来源于stack exchange,提问作者RUS DESIGN

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:55:53