在这篇文章中,我们将深入探讨一个用于 PbootCMS 的百度推送 PHP 脚本。该脚本旨在支持两种类型的数据库:SQLite 和 MySQL。本文将详细说明两个脚本的实现细节、执行流程以及使用它们时的注意事项。
一、PHP 脚本简介
这两个 PHP 文件实现了以下功能:
-
连接到数据库(MySQL 或 SQLite)。
-
获取当天发布的文章信息。
-
将这些文章推送到百度,以便加速搜索引擎收录。
主要区别在于一个脚本适用于 MySQL 数据库,而另一个适用于 SQLite 数据库。
二、执行流程解析
-
数据库连接:
-
MySQL 版本的脚本使用
PDO
连接到 MySQL 数据库,包含了数据库主机、名称、用户名和密码等参数。连接时设置了错误处理模式,以便在连接失败时抛出异常。 -
SQLite 版本的脚本同样使用
PDO
进行连接,但数据库路径是一个文件路径,不需要用户名和密码。 -
获取当天数据:
-
通过
date_default_timezone_set('Asia/Shanghai')
设置时区,并使用date('Y-m-d')
来获取当天的日期。 -
使用 SQL 查询来检索当天发布的文章,并通过
LEFT JOIN
关联栏目表以便获取完整信息。 -
百度推送逻辑:
-
获取文章数据后,构建推送的 URL 列表。
-
使用
curl
库发送 POST 请求,将这些 URLs 推送到百度的链接提交接口。
三、实现细节与代码片段
MySQL PHP 脚本 关键部分如下:
try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "数据库连接成功!"; } catch (Exception $e) { die("数据库连接失败: " . $e->getMessage()); }
SQLite PHP 脚本 关键部分如下:
try { $pdo = new PDO("sqlite:$dbFile"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "数据库连接成功!"; } catch (Exception $e) { die("数据库连接失败: " . $e->getMessage()); }
Mysql完整代码:
<?php // MySQL数据库连接设置 $dbHost = 'localhost'; // MySQL服务器地址 $dbName = 'pbtest_cc'; // 数据库名称 $dbUser = 'root'; // 数据库用户名 $dbPass = 'root'; // 数据库密码 // 连接MySQL数据库 try { $pdo = new PDO("mysql:host=$dbHost;dbname=$dbName;charset=utf8", $dbUser, $dbPass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $connectionMessage = "数据库连接成功!"; } catch (Exception $e) { die("<div>数据库连接失败: " . $e->getMessage() . "</div>"); } // 获取当天日期 date_default_timezone_set('Asia/Shanghai'); $today = date('Y-m-d'); // 仅获取日期部分 // 查询当天发布的文章并关联栏目表 $query = " SELECT a.id, a.title, a.create_time, a.date, s.filename FROM ay_content a JOIN ay_content_sort s ON a.scode = s.scode WHERE (a.create_time LIKE CONCAT(:today, '%')) OR (a.date LIKE CONCAT(:today, '%')) "; $stmt = $pdo->prepare($query); $stmt->execute([':today' => $today]); $articles = $stmt->fetchAll(PDO::FETCH_ASSOC); // 构建HTML内容 ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>当天发布文章推送</title> <style> body { font-family: Arial, sans-serif; line-height: 1.6; background-color: #f4f4f4; color: #333; margin: 0; padding: 20px; } .container { max-width: 800px; margin: auto; background: #fff; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } h1 { color: #0073e6; } .success { color: #28a745; font-weight: bold; } .error { color: #dc3545; font-weight: bold; } table { width: 100%; border-collapse: collapse; margin: 20px 0; } table, th, td { border: 1px solid #ddd; } th, td { padding: 10px; text-align: left; } th { background-color: #f2f2f2; } .push-result { margin-top: 20px; padding: 10px; background-color: #e8f7ff; border-left: 4px solid #0073e6; } </style> </head> <body> <div> <h1>当天发布文章推送</h1> <p><?= $connectionMessage ?></p> <p>脚本获取的日期: <strong><?= $today ?></strong></p> <?php if (empty($articles)): ?> <p>没有当天发布的文章。</p> <?php else: ?> <h2>查询到的当天发布的文章数据:</h2> <table> <thead> <tr> <th>ID</th> <th>标题</th> <th>创建时间</th> <th>日期字段</th> <th>栏目目录</th> </tr> </thead> <tbody> <?php foreach ($articles as $article): ?> <tr> <td><?= htmlspecialchars($article['id']) ?></td> <td><?= htmlspecialchars($article['title']) ?></td> <td><?= htmlspecialchars($article['create_time']) ?></td> <td><?= htmlspecialchars($article['date']) ?></td> <td><?= htmlspecialchars($article['filename']) ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php // 拼接文章的URL,根据自定义格式构建URL列表 $domain = 'http://pbtest.cc'; // 替换为实际的域名 $urls = []; foreach ($articles as $article) { // 使用自定义格式替换文章ID,例如:http://pbtest.cc/{filename}/{id}.html $urls[] = $domain . '/' . $article['filename'] . '/' . $article['id'] . '.html'; } // 输出待推送的URL用于调试 echo "<h2>待推送的URL列表:</h2>"; echo "<ul>"; foreach ($urls as $url) { echo "<li>" . htmlspecialchars($url) . "</li>"; } echo "</ul>"; // 调用百度推送 API $api = 'http://data.zz.baidu.com/urls?site=pbtest.cc&token=填写token'; $ch = curl_init(); $options = array( CURLOPT_URL => $api, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => implode("\n", $urls), CURLOPT_HTTPHEADER => array('Content-Type: text/plain'), ); curl_setopt_array($ch, $options); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 解析并人性化地显示推送结果 $resultMessage = ""; if ($httpCode == 200) { $resultData = json_decode($result, true); if (isset($resultData['success'])) { $resultMessage .= "<p>成功推送 " . $resultData['success'] . " 条URL。</p>"; $resultMessage .= "<p>当天剩余可推送URL条数:" . $resultData['remain'] . "</p>"; } if (!empty($resultData['not_same_site'])) { $resultMessage .= "<p>以下URL因非本站URL未被处理:</p><ul>"; foreach ($resultData['not_same_site'] as $url) { $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>"; } $resultMessage .= "</ul>"; } if (!empty($resultData['not_valid'])) { $resultMessage .= "<p>以下URL因不合法未被处理:</p><ul>"; foreach ($resultData['not_valid'] as $url) { $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>"; } $resultMessage .= "</ul>"; } } else { $resultData = json_decode($result, true); $resultMessage .= "<p>推送失败:错误代码 " . htmlspecialchars($resultData['error']) . ",错误信息:" . htmlspecialchars($resultData['message']) . "</p>"; } ?> <div> <h2>推送结果:</h2> <?= $resultMessage ?> </div> <?php endif; ?> </div> </body> </html>
Sqlte完整代码:
<?php // 数据库文件路径 $dbFile = 'data/996815973291cc38d8a05e66610fb6a3.db'; // 替换为正确的数据库文件路径 // 连接SQLite数据库 try { $pdo = new PDO("sqlite:$dbFile"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $connectionMessage = "数据库连接成功!"; } catch (Exception $e) { die("<div>数据库连接失败: " . $e->getMessage() . "</div>"); } // 获取当天日期 date_default_timezone_set('Asia/Shanghai'); $today = date('Y-m-d'); // 仅获取日期部分 // 查询当天发布的文章并关联栏目表 $query = " SELECT a.id, a.title, a.create_time, a.date, s.filename FROM ay_content a JOIN ay_content_sort s ON a.scode = s.scode WHERE (a.create_time LIKE :today || '%') OR (a.date LIKE :today || '%') "; $stmt = $pdo->prepare($query); $stmt->execute([':today' => $today]); $articles = $stmt->fetchAll(PDO::FETCH_ASSOC); // 构建HTML内容 ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>当天发布文章推送</title> <style> body { font-family: Arial, sans-serif; line-height: 1.6; background-color: #f4f4f4; color: #333; margin: 0; padding: 20px; } .container { max-width: 800px; margin: auto; background: #fff; padding: 20px; box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } h1 { color: #0073e6; } .success { color: #28a745; font-weight: bold; } .error { color: #dc3545; font-weight: bold; } table { width: 100%; border-collapse: collapse; margin: 20px 0; } table, th, td { border: 1px solid #ddd; } th, td { padding: 10px; text-align: left; } th { background-color: #f2f2f2; } .push-result { margin-top: 20px; padding: 10px; background-color: #e8f7ff; border-left: 4px solid #0073e6; } </style> </head> <body> <div> <h1>当天发布文章推送</h1> <p><?= $connectionMessage ?></p> <p>脚本获取的日期: <strong><?= $today ?></strong></p> <?php if (empty($articles)): ?> <p>没有当天发布的文章。</p> <?php else: ?> <h2>查询到的当天发布的文章数据:</h2> <table> <thead> <tr> <th>ID</th> <th>标题</th> <th>创建时间</th> <th>日期字段</th> <th>栏目目录</th> </tr> </thead> <tbody> <?php foreach ($articles as $article): ?> <tr> <td><?= htmlspecialchars($article['id']) ?></td> <td><?= htmlspecialchars($article['title']) ?></td> <td><?= htmlspecialchars($article['create_time']) ?></td> <td><?= htmlspecialchars($article['date']) ?></td> <td><?= htmlspecialchars($article['filename']) ?></td> </tr> <?php endforeach; ?> </tbody> </table> <?php // 拼接文章的URL,根据自定义格式构建URL列表 $domain = 'https://funds.hexun.com'; // 替换为实际的域名 $urls = []; foreach ($articles as $article) { // 使用自定义格式替换文章ID,例如:https://funds.hexun.com/{filename}/{id}.html $urls[] = $domain . '/' . $article['filename'] . '/' . $article['id'] . '.html'; } // 输出待推送的URL用于调试 echo "<h2>待推送的URL列表:</h2>"; echo "<ul>"; foreach ($urls as $url) { echo "<li>" . htmlspecialchars($url) . "</li>"; } echo "</ul>"; // 调用百度推送 API $api = 'http://data.zz.baidu.com/urls?site=填写域名&token=填写token'; $ch = curl_init(); $options = array( CURLOPT_URL => $api, CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => implode("\n", $urls), CURLOPT_HTTPHEADER => array('Content-Type: text/plain'), ); curl_setopt_array($ch, $options); $result = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); // 解析并人性化地显示推送结果 $resultMessage = ""; if ($httpCode == 200) { $resultData = json_decode($result, true); if (isset($resultData['success'])) { $resultMessage .= "<p>成功推送 " . $resultData['success'] . " 条URL。</p>"; $resultMessage .= "<p>当天剩余可推送URL条数:" . $resultData['remain'] . "</p>"; } if (!empty($resultData['not_same_site'])) { $resultMessage .= "<p>以下URL因非本站URL未被处理:</p><ul>"; foreach ($resultData['not_same_site'] as $url) { $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>"; } $resultMessage .= "</ul>"; } if (!empty($resultData['not_valid'])) { $resultMessage .= "<p>以下URL因不合法未被处理:</p><ul>"; foreach ($resultData['not_valid'] as $url) { $resultMessage .= "<li>" . htmlspecialchars($url) . "</li>"; } $resultMessage .= "</ul>"; } } else { $resultData = json_decode($result, true); $resultMessage .= "<p>推送失败:错误代码 " . htmlspecialchars($resultData['error']) . ",错误信息:" . htmlspecialchars($resultData['message']) . "</p>"; } ?> <div> <h2>推送结果:</h2> <?= $resultMessage ?> </div> <?php endif; ?> </div> </body> </html>
下载:
pbootcms百度推送PHP脚本_2024-11-18_v1
四、注意事项
-
数据库路径:在使用 SQLite 时,确保提供正确的数据库文件路径。
-
安全性:在生产环境中,避免将数据库密码和连接信息硬编码在文件中。可以通过配置文件或环境变量进行管理。
-
URL 校验:在推送到百度之前,验证 URL 是否符合标准格式以提高成功率。
五、提交效果
六、总结
这两个 PHP 脚本实现了自动推送 PbootCMS 内容到百度的功能。它们在不同类型的数据库之间提供了灵活性,使开发者可以根据实际需求选择合适的实现方式。
这套脚本是内容网站实现快速收录的有效工具,希望大家在使用时能根据自身项目的特点进行适当调整。