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
相关产品推荐
相关产品推荐

