在这篇文章中,我们将深入探讨一个用于 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 内容到百度的功能。它们在不同类型的数据库之间提供了灵活性,使开发者可以根据实际需求选择合适的实现方式。
这套脚本是内容网站实现快速收录的有效工具,希望大家在使用时能根据自身项目的特点进行适当调整。