php的案例分析----typecho项目
typecho/typecho: A PHP Blogging Platform. Simple and Powerful.
下载的代码的地址
Download - Typecho Official Site
主要时能在网站上使用makdown的语法编写
步骤 1:创建项目目录
mkdir typecho-docker && cd typecho-docker
步骤 2:编写 Docker Compose 文件
version: '3.8'
services:
# 数据库服务
db:
image: mysql:8.1
container_name: typecho-db
restart: always
environment:
MYSQL_ROOT_PASSWORD: root_password
MYSQL_DATABASE: typecho
MYSQL_USER: typecho_user
MYSQL_PASSWORD: typecho_password
volumes:
- mysql-data:/var/lib/mysql
networks:
- typecho-network
# PHP-FPM服务
php-fpm:
image: bitnami/php-fpm:latest
container_name: typecho-php-fpm
restart: always
volumes:
- ./typecho:/var/www/html
depends_on:
- db
networks:
- typecho-network
# Nginx服务
nginx:
image: nginx:latest
container_name: typecho-nginx
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./typecho:/var/www/html
- ./nginx-conf:/etc/nginx/conf.d
- ./ssl:/etc/ssl/certs
depends_on:
- php-fpm
networks:
- typecho-network
networks:
typecho-network:
driver: bridge
volumes:
mysql-data:
步骤 3:配置 Nginx
创建nginx-conf
目录并添加typecho.conf
:
mkdir nginx-conf && nano nginx-conf/typecho.conf
server {
listen 80;
server_name localhost;
root /var/www/html;
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass typecho-php-fpm:9000;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
location ~ /var/ {
deny all;
}
}
步骤 4:获取 Typecho 源码
自己先下载到本地
unzip typecho.zip -d typecho
rm typecho.zip
chown -R 1001:1001 typecho
测试连接数据库脚本\
test_db.php
<?php
// 数据库配置信息
$host = 'db'; // 数据库主机(Docker 中为服务名)
$dbname = 'typecho'; // 数据库名
$username = 'typecho_user'; // 用户名
$password = 'typecho_password'; // 密码
$port = 3306; // 端口号(MySQL 默认 3306)
try {
// 创建 PDO 连接
$pdo = new PDO("mysql:host=$host;dbname=$dbname;port=$port;charset=utf8mb4", $username, $password);
// 设置错误模式为异常
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "数据库连接成功!<br>";
// 测试查询
$stmt = $pdo->query("SELECT VERSION()");
$version = $stmt->fetchColumn();
echo "MySQL 版本:$version<br>";
// 测试创建表
$createTableSQL = "CREATE TABLE IF NOT EXISTS `test_table` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`created_at` datetime DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;";
$pdo->exec($createTableSQL);
echo "测试表创建成功!<br>";
// 插入测试数据
$insertSQL = "INSERT INTO `test_table` (`name`) VALUES ('测试数据')";
$pdo->exec($insertSQL);
$lastInsertId = $pdo->lastInsertId();
echo "数据插入成功,ID:$lastInsertId<br>";
// 查询测试数据
$selectSQL = "SELECT * FROM `test_table` WHERE `id` = :id";
$stmt = $pdo->prepare($selectSQL);
$stmt->bindParam(':id', $lastInsertId, PDO::PARAM_INT);
$stmt->execute();
if ($stmt->rowCount() > 0) {
$row = $stmt->fetch(PDO::FETCH_ASSOC);
echo "数据查询成功:ID={$row['id']},名称={$row['name']},创建时间={$row['created_at']}<br>";
}
// 删除测试表
$dropTableSQL = "DROP TABLE IF EXISTS `test_table`";
$pdo->exec($dropTableSQL);
echo "测试表已删除!<br>";
} catch (PDOException $e) {
die("数据库连接失败:" . $e->getMessage());
}
// 关闭连接(可选,脚本结束时会自动关闭)
$pdo = null;
?>
步骤 5:启动容器
docker-compose up -d
访问http://10.0.0.110/install.php
[root@docker-110 usr]# ls
plugins themes
[root@docker-110 usr]# mkdir uploads
步骤 6:完成安装
- 访问
http://localhost
进入安装向导。 - 数据库配置:
- 主机:
db
- 数据库名:
typecho
- 用户名:
typecho_user
- 密码:
typecho_password
- 主机:
- 设置管理员账号,完成安装
安装程序无法自动创建 config.inc.php 文件
您可以在网站根目录下手动创建 config.inc.php 文件, 并复制如下代码至其中
<?php
// site root path
define('__TYPECHO_ROOT_DIR__', dirname(__FILE__));
// plugin directory (relative path)
define('__TYPECHO_PLUGIN_DIR__', '/usr/plugins');
// theme directory (relative path)
define('__TYPECHO_THEME_DIR__', '/usr/themes');
// admin directory (relative path)
define('__TYPECHO_ADMIN_DIR__', '/admin/');
// register autoload
require_once __TYPECHO_ROOT_DIR__ . '/var/Typecho/Common.php';
// init
\Typecho\Common::init();
// config db(重要:修改以下数据库信息)
$db = new \Typecho\Db('Pdo_Mysql', 'typecho_');
$db->addServer(array (
'host' => 'db', // Docker环境中为服务名,传统服务器为localhost
'port' => 3306, // 数据库端口
'user' => 'typecho_user', // 数据库用户名
'password' => 'typecho_password', // 数据库密码
'charset' => 'utf8mb4',
'database' => 'typecho', // 数据库名
'engine' => 'InnoDB',
'sslCa' => '',
'sslVerify' => true,
), \Typecho\Db::READ | \Typecho\Db::WRITE);
\Typecho\Db::set($db);