在使用 PHPStorm 进行 ThinkPHP8 开发之前,我们需要搭建好开发环境,主要包括下载安装 PHPStorm、PHP、ThinkPHP8 及相关扩展组件。
composer create-project topthink/think tp8_project
上述命令会在当前目录下创建一个名为tp8_project的 ThinkPHP8 项目。等待安装完成,即可开始项目开发。
Xdebug 是一个开源的 PHP 程序代码调试工具,可以用来跟踪、调试和分析 PHP 程序的运行状况。配置 Xdebug 能让我们在 PHPStorm 中进行断点调试,方便查找代码中的问题。
[Xdebug]
zend_extension = "你的Xdebug扩展文件路径"
xdebug.remote_enable = 1
xdebug.remote_autostart = 1
xdebug.remote_port = 9000
xdebug.idekey = "PHPSTORM"
将 “你的 Xdebug 扩展文件路径” 替换为实际下载的 Xdebug 扩展文件所在路径,例如C:\php\ext\php_xdebug.dll 。这些配置的作用分别是:zend_extension指定 Xdebug 扩展文件的路径;xdebug.remote_enable开启远程调试功能;xdebug.remote_autostart自动启动远程调试;xdebug.remote_port设置调试端口为 9000;xdebug.idekey设置调试器的关键字为 “PHPSTORM” ,与 PHPStorm 中的配置相对应。
phpinfo();
然后在浏览器中访问http://localhost/test.php(假设 Web 服务器的域名是localhost ),在打开的页面中搜索 “xdebug”,如果能找到 Xdebug 相关的信息,说明 Xdebug 已经成功安装并配置。
完成前期准备工作后,接下来我们要在 PHPStorm 中导入 ThinkPHP8 项目。打开 PHPStorm,点击菜单栏中的 “File”,选择 “Open”,在弹出的文件选择窗口中,找到之前通过 Composer 创建的 ThinkPHP8 项目的根目录,例如tp8_project,选中该目录后点击 “OK”。PHPStorm 会自动识别项目结构,并加载项目中的文件,稍等片刻,项目就成功导入到 PHPStorm 中了 。导入成功后,你可以在 PHPStorm 的项目导航栏中看到项目的文件目录结构,包括app应用目录、public公共目录、config配置目录等,这些目录分别存放着不同功能的代码和文件,方便我们进行项目开发和管理。
PHP 解释器是 PHPStorm 运行 PHP 代码的关键,需要确保配置正确。在 PHPStorm 中,点击菜单栏的 “File”,选择 “Settings”(在 Mac 系统中是 “PhpStorm” -> “Preferences”),打开设置窗口。在设置窗口中,找到 “Languages & Frameworks” -> “PHP” ,在右侧的 “CLI Interpreter”(命令行解释器)选项中,点击后面的 “…” 按钮。如果列表中没有你需要的 PHP 解释器版本,点击 “+” 按钮添加。在弹出的窗口中,选择 “PHP executable”,然后通过文件浏览器找到你安装 PHP 的目录,选择其中的php.exe文件,例如 “C:\php\php.exe”,点击 “OK”。此时,PHPStorm 会自动检测并显示该 PHP 版本的相关信息,如版本号、已安装的扩展等。确认无误后,再次点击 “OK” 保存设置。这样,PHPStorm 就配置好了正确的 PHP 解释器,能够对项目中的 PHP 代码进行语法检查、运行和调试等操作。
配置服务器可以让我们在 PHPStorm 中方便地运行和调试 ThinkPHP8 项目。同样在设置窗口中,找到 “Languages & Frameworks” -> “PHP” -> “Servers” ,点击 “+” 按钮添加一个新的服务器配置。在弹出的配置窗口中,填写以下信息:
配置完成后,点击 “OK” 保存设置。此时,我们就完成了服务器的配置,在 PHPStorm 中可以通过这个服务器配置来运行和调试 ThinkPHP8 项目,如点击工具栏上的 “Run” 按钮或 “Debug” 按钮来启动项目或进行断点调试。
在深入开发 ThinkPHP8 项目之前,我们需要对其项目结构有清晰的了解,这有助于我们更好地组织代码和进行开发工作。一个典型的 ThinkPHP8 项目结构如下:
在 ThinkPHP8 中,控制器是处理用户请求的核心部分,下面我们来详细介绍如何创建控制器和方法。
namespace app\controller;
接着,需要继承think\Controller类,这个类提供了一些控制器的基础功能和方法,方便我们进行开发,代码如下:
use think\Controller;
class UserController extends Controller
{
// 控制器代码将写在这里
}
public function index()
{
// 这里编写处理用户请求的逻辑,比如从数据库获取用户数据
return '这是用户列表页面';
}
上述代码中,index方法是一个公共方法,它返回一个字符串,在实际应用中,这里可能会调用模型获取数据,然后将数据传递给视图进行展示 。如果需要获取用户请求中的参数,可以使用request对象,例如获取 GET 请求中的id参数:
public function detail()
{
$id = $this->request->get('id');
// 根据$id从数据库获取用户详情数据
return '用户详情页面,用户id为:'. $id;
}
在上述代码中,$this->request表示当前的请求对象,通过get方法可以获取 GET 请求中的参数。如果是 POST 请求,可以使用post方法获取参数 。通过合理地创建控制器和方法,并在其中编写业务逻辑代码,我们就可以实现对用户各种请求的处理,完成项目的功能开发。
视图渲染和数据传递是将数据展示给用户的关键步骤,下面我们来介绍在 ThinkPHP8 中如何进行视图渲染和数据传递。
public function index()
{
return $this->fetch('user/index');
}
上述代码中,$this->fetch(‘user/index’)表示加载app/view/user/index.html模板文件,并将其渲染后返回给浏览器展示给用户。如果模板文件有布局文件,还可以通过layout方法来设置布局文件,例如:
public function index()
{
$this->layout('layout/default');
return $this->fetch('user/index');
}
上述代码中,$this->layout(‘layout/default’)表示设置布局文件为app/view/layout/default.html,在渲染user/index.html模板时,会将其内容嵌入到布局文件中相应的位置进行展示。
public function index()
{
// 从数据库获取用户列表数据,这里假设$userList是获取到的数据
$userList = ['user1', 'user2', 'user3'];
$this->assign('userList', $userList);
return $this->fetch('user/index');
}
在上述代码中,$this->assign(‘userList’, $userList)表示将$userList数据以userList为变量名传递到视图中。在app/view/user/index.html模板文件中,可以通过模板引擎的语法来输出这些数据,例如使用默认的模板引擎语法:
<ul>
{foreach $userList as $user}
<li>{$user}</li>
{/foreach}
</ul>
上述代码中,通过foreach循环遍历$userList变量,并将每个用户数据输出到页面上的列表项中。通过合理地进行视图渲染和数据传递,我们可以将控制器中获取和处理的数据以友好的界面展示给用户,提升用户体验。
在 ThinkPHP8 项目中,数据库配置是实现数据持久化存储和读取的基础。数据库配置文件位于config目录下的database.php文件中,通过对该文件的配置,我们可以连接不同类型的数据库,如 MySQL、SQLite、PostgreSQL 等。以 MySQL 数据库为例,下面详细介绍数据库配置的步骤和参数含义。
'mysql' => [
// 数据库类型
'type' =>'mysql',
// 服务器地址
'hostname' => '127.0.0.1',
// 数据库端口
'hostport' => '3306',
// 数据库用户名
'username' => 'root',
// 数据库密码
'password' => '',
// 数据库名
'database' => 'your_database_name',
// 数据库连接参数
'params' => [],
// 数据库编码默认采用utf8
'charset' => 'utf8',
// 数据库表前缀
'prefix' => 'tp_',
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'deploy' => 0,
// 数据库读写是否分离 主从式有效
'rw_separate' => false,
// 读写分离后 主服务器数量
'master_num' => 1,
// 指定从服务器序号
'slave_no' => '',
// 是否严格检查字段是否存在
'fields_strict' => true,
// 数据集返回类型 array 数组 collection Collection对象
'resultset_type' => 'array',
// 自动写入时间戳字段
'auto_timestamp' => false,
// 时间字段取出后的默认时间格式
'datetime_format' => 'Y-m-d H:i:s',
// 是否需要进行SQL性能分析
'query' => false,
],
在上述配置中,各项参数的含义如下:
模型是 ThinkPHP8 中与数据库进行交互的重要部分,通过定义模型类,我们可以方便地进行数据的读取、写入、更新和删除等操作,还能定义数据表之间的关联关系。下面以用户表为例,介绍模型的定义与使用。
namespace app\model;
use think\Model;
class User extends Model
{
// 模型代码将写在这里
}
public function roles()
{
return $this->belongsToMany('Role', 'tp_user_role', 'role_id', 'user_id');
}
上述代码中,belongsToMany方法表示多对多关联关系,第一个参数Role是关联的模型类名,第二个参数tp_user_role是中间表名,第三个参数role_id是中间表中关联角色表的外键,第四个参数user_id是中间表中关联用户表的外键。通过这样的定义,我们可以方便地获取用户所属的角色信息。
$users = User::select();
foreach ($users as $user) {
echo $user->name. '
';
}
上述代码中,User::select()方法从数据库中查询所有用户数据,并返回一个数据集对象,通过遍历数据集对象可以获取每个用户的信息。如果要根据条件查询用户,比如查询用户名是 “张三” 的用户:
$user = User::where('name', '张三')->find();
if ($user) {
echo $user->email;
}
这里使用where方法添加查询条件,find方法返回满足条件的第一条数据。在进行数据写入时,例如添加一个新用户:
$user = new User();
$user->name = '李四';
$user->email = '[email protected]';
$user->save();
上述代码创建一个User模型实例,设置用户的名称和邮箱属性,然后调用save方法将数据保存到数据库中。如果要更新用户数据,例如更新用户名为 “李四” 的用户邮箱:
$user = User::where('name', '李四')->find();
if ($user) {
$user->email = '[email protected]';
$user->save();
}
通过先查询到要更新的用户数据,修改其属性后再调用save方法即可完成数据更新。删除用户数据也很简单,比如删除用户名为 “王五” 的用户:
User::where('name', '王五')->delete();
使用where方法指定删除条件,然后调用delete方法即可删除满足条件的数据。通过合理地定义模型和使用模型方法,我们可以高效地进行数据库操作,实现项目的数据管理功能。
在 ThinkPHP8 项目开发过程中,数据库结构可能会不断变化,同时也需要初始化一些测试数据。数据库迁移和种子功能可以帮助我们方便地管理数据库结构变化和填充初始数据。
php think make:migration create_users_table
上述命令会在database/migrations目录下创建一个新的迁移文件,文件名以时间戳和迁移名称命名,例如20241010153000_create_users_table.php 。打开创建的迁移文件,里面包含up和down方法,up方法用于定义数据库结构的升级操作,down方法用于定义回滚操作。例如,创建一个users表的迁移文件内容如下:
use think\migration\Migrator;
use think\migration\db\Column;
class CreateUsersTable extends Migrator
{
public function up()
{
$table = $this->table('users');
$table->addColumn('name','string', ['limit' => 50])
->addColumn('email','string', ['limit' => 100])
->addColumn('password','string', ['limit' => 255])
->addTimestamps()
->create();
}
public function down()
{
$this->dropTable('users');
}
}
在up方法中,使用table方法创建一个users表对象,然后通过addColumn方法添加字段,addTimestamps方法会自动添加created_at和updated_at时间戳字段,最后调用create方法创建表。在down方法中,使用dropTable方法删除users表,实现回滚操作。
php think migrate
上述命令会执行所有未执行的迁移文件,将数据库结构更新到最新状态。如果要回滚到上一个迁移,可以执行以下命令:
php think migrate:rollback
这个命令会回滚到上一个迁移文件,撤销上一次的数据库结构变化。如果要回滚到指定的迁移文件,可以使用php think migrate:rollback -t 迁移文件名,例如php think migrate:rollback -t 20241010153000_create_users_table.php 。
php think seed:create UserSeeder
上述命令会在database/seeds目录下创建一个UserSeeder.php文件。打开该文件,在run方法中编写填充数据的逻辑,例如向users表中插入一些测试用户数据:
use think\migration\Seeder;
class UserSeeder extends Seeder
{
public function run()
{
$data = [
['name' => '用户1', 'email' => '[email protected]', 'password' => password_hash('123456', PASSWORD_DEFAULT)],
['name' => '用户2', 'email' => '[email protected]', 'password' => password_hash('123456', PASSWORD_DEFAULT)],
];
$this->table('users')->insert($data)->save();
}
}
在上述代码中,定义了一个包含两个用户数据的数组$data,然后使用table方法获取users表对象,通过insert方法插入数据,最后调用save方法保存操作。完成种子文件编写后,在命令行中执行以下命令来填充数据:
php think seed:run
上述命令会执行所有的种子文件,将数据填充到数据库中。如果只想执行某个特定的种子文件,可以使用php think seed:run -s 种子文件名,例如php think seed:run -s UserSeeder.php 。通过合理使用数据库迁移和种子功能,我们可以更好地管理数据库结构和数据,提高项目开发和维护的效率。
在 ThinkPHP8 开发中,路由优化与管理对于提升应用的性能和用户体验至关重要。合理的路由配置可以使 URL 更加简洁美观,方便用户记忆和使用,同时也能提高应用的可维护性和扩展性。
use think\facade\Route;
Route::get('article/:id', 'article/detail');
上述代码定义了一个 GET 请求的路由规则,当用户访问/article/1时,会自动路由到article控制器的detail方法,并将1作为参数传递给该方法。这样的 URL 不仅更简洁直观,还有助于搜索引擎优化(SEO),因为搜索引擎更容易理解和索引这样的 URL 结构。
Route::get('user/:name/:id', 'user/info');
在user控制器的info方法中,可以通过$this->request->param()方法获取这些参数:
public function info()
{
$name = $this->request->param('name');
$id = $this->request->param('id');
// 根据$name和$id获取用户信息并进行展示
return '用户名为:'. $name. ',用户ID为:'. $id;
}
此外,还可以对路由参数设置规则,确保参数的合法性。例如,只允许id为数字,可以这样定义:
Route::get('user/:name/:id', 'user/info', [], ['id' => '\d+']);
上述代码中,[‘id’ => ‘\d+’]表示id参数必须是数字,这样可以避免非法参数导致的错误。
Route::group('admin', function () {
Route::get('user/index', 'admin/user/index');
Route::get('article/index', 'admin/article/index');
Route::get('order/index', 'admin/order/index');
});
上述代码定义了一个名为admin的路由分组,所有以/admin开头的 URL 都会进入这个分组。在分组内,分别定义了用户管理、文章管理、订单管理模块的路由规则。这样,当我们需要对后台管理系统的路由进行修改或扩展时,只需要在admin分组内进行操作,不会影响到其他模块的路由。同时,路由分组还可以方便地设置一些公共的中间件或参数,提高代码的复用性。例如,为admin分组设置身份验证中间件:
Route::group('admin', function () {
Route::get('user/index', 'admin/user/index');
Route::get('article/index', 'admin/article/index');
Route::get('order/index', 'admin/order/index');
})->middleware('auth');
上述代码中,->middleware(‘auth’)表示为admin分组内的所有路由都添加了名为auth的中间件,用于验证用户的身份,只有通过身份验证的用户才能访问这些路由。
中间件是 ThinkPHP8 中非常重要的功能,它可以在请求到达控制器之前或之后执行一些通用的操作,如身份验证、日志记录、请求参数校验等,从而提高代码的复用性和可维护性。
namespace app\middleware;
use think\facade\Session;
use think\Response;
class AuthMiddleware
{
public function handle($request, \Closure $next)
{
// 检查用户是否已登录,这里通过Session判断
if (!Session::has('user_id')) {
// 用户未登录,返回错误信息或重定向到登录页面
return Response::create('Unauthorized', 'json', 401);
}
// 用户已登录,继续处理请求
return $next($request);
}
}
在上述代码中,handle方法是中间件的核心方法,它接收$request请求对象和$next闭包函数作为参数。在handle方法中,首先检查用户是否已登录,如果未登录,返回一个 HTTP 401 错误响应;如果已登录,则调用$next($request)继续处理请求,将请求传递给下一个中间件或控制器。
return [
'auth' => \app\middleware\AuthMiddleware::class,
];
Route::group('admin', function () {
Route::get('user/index', 'admin/user/index');
Route::get('article/index', 'admin/article/index');
})->middleware('auth');
namespace app\admin\controller;
use think\Controller;
class UserController extends Controller
{
protected $middleware = ['auth'];
public function index()
{
// 控制器逻辑代码
}
}
namespace app\middleware;
use think\facade\Log;
use think\Request;
use think\Response;
class LogMiddleware
{
public function handle(Request $request, \Closure $next)
{
// 在请求处理之前记录日志
Log::record('请求开始:'. $request->url());
$response = $next($request);
// 在响应发送给客户端之前记录日志
Log::record('请求结束:'. $request->url());
return $response;
}
}
在上述代码中,在请求处理之前,使用Log::record方法记录请求的 URL;在响应返回之前,再次记录请求的 URL。通过这种方式,我们可以方便地跟踪请求的处理过程,排查问题和监控应用的运行状态。同时,中间件还可以对响应进行修改,例如添加自定义的 HTTP 头信息:
public function handle(Request $request, \Closure $next)
{
$response = $next($request);
// 添加自定义的HTTP头信息
$response->header('Custom-Header', 'Value');
return $response;
}
上述代码在响应返回给客户端之前,添加了一个名为Custom-Header的 HTTP 头信息及其对应的值。
在 Web 应用开发中,缓存机制是提升性能的重要手段之一。ThinkPHP8 提供了强大的缓存支持,合理使用缓存可以减少数据库查询次数、降低服务器负载,从而提高应用的响应速度和用户体验。同时,优化数据库查询也是性能优化的关键环节。
use think\facade\Cache;
public function articleList()
{
// 尝试从缓存中获取文章列表数据
$articleList = Cache::get('article_list');
if ($articleList) {
// 如果缓存中有数据,直接返回
return json($articleList);
}
// 如果缓存中没有数据,从数据库中查询
$articleList = Article::select();
// 将查询结果存入缓存,有效期为1小时(3600秒)
Cache::set('article_list', $articleList, 3600);
return json($articleList);
}
在上述代码中,首先使用Cache::get(‘article_list’)尝试从缓存中获取文章列表数据,如果缓存中有数据,直接返回;如果缓存中没有数据,从数据库中查询文章列表数据,然后使用Cache::set(‘article_list’, $articleList, 3600)将查询结果存入缓存,有效期为 3600 秒。当下次请求该页面时,就可以直接从缓存中获取数据,大大提高了响应速度。如果要使用 Redis 缓存,只需要在config/cache.php配置文件中修改缓存类型为redis,并配置好 Redis 服务器的相关信息:
'type' =>'redis',
'host' => '127.0.0.1',
'port' => 6379,
// 其他Redis配置参数
然后在代码中使用缓存类的方式不变,这样就实现了从文件缓存到 Redis 缓存的切换,利用 Redis 的高性能来提升缓存的读写速度,尤其适用于高并发的应用场景。
// 缓存数据,有效期为30分钟(1800秒)
Cache::set('user_info', $userInfo, 1800);
除了设置固定的有效期,还可以根据业务需求动态调整缓存有效期。比如,对于一些实时性要求较高的数据,可以在数据更新时,同时更新缓存的有效期或者直接删除缓存,确保下次请求时获取到最新的数据。例如,当用户信息发生更新时,在更新数据库的同时删除缓存:
public function updateUserInfo()
{
// 更新用户信息到数据库
User::where('id', $userId)->update($data);
// 删除缓存中的用户信息
Cache::delete('user_info');
return json(['message' => '用户信息更新成功']);
}
这样,下次获取用户信息时,由于缓存中已无数据,会重新从数据库查询,保证获取到的是最新的用户信息。
Schema::table('users', function ($table) {
$table->index('username');
});
其次,要避免 N+1 查询问题,N+1 查询会导致大量不必要的数据库查询,影响性能。例如,有一个用户模型User,每个用户有多个文章Article,如果要获取所有用户及其文章信息,不优化的查询方式可能会导致 N+1 查询:
$users = User::select();
foreach ($users as $user) {
$articles = Article::where('user_id', $user->id)->select();
$user->articles = $articles;
}
在上述代码中,每次循环都会执行一次数据库查询,查询用户的文章列表。如果有 100 个用户,就会执行 101 次查询(1 次查询用户列表,100 次查询每个用户的文章列表)。可以使用 ThinkPHP8 的预加载功能来避免这种情况:
$users = User::with('articles')->select();
上述代码使用with(‘articles’)预加载用户的文章列表,只需要执行 2 次查询(1 次查询用户列表,1 次查询所有用户的文章列表),大大提高了查询效率。此外,还可以对复杂的查询进行优化,尽量减少子查询、联合查询等复杂操作,合理使用缓存来存储查询结果,避免重复执行相同的查询。例如,对于一些统计数据的查询,由于数据更新频率较低,可以将查询结果缓存起来,减少数据库的压力:
public function statistics()
{
// 尝试从缓存中获取统计数据
$statistics = Cache::get('statistics');
if ($statistics) {
return json($statistics);
}
// 如果缓存中没有数据,执行复杂的统计查询
$statistics = Db::table('orders')
->field('SUM(amount) as total_amount, COUNT(*) as order_count')
->select()
->toArray();
// 将统计结果存入缓存,有效期为1小时(3600秒)
Cache::set('statistics', $statistics, 3600);
return json($statistics);
}
通过以上缓存机制的应用和数据库查询的优化,可以有效地提升 ThinkPHP8 应用的性能,为用户提供更流畅的使用体验。
在开发过程中,调试是查找和修复代码问题的重要手段。PHPStorm 提供了强大的断点调试功能,结合之前配置好的 Xdebug,我们可以方便地对 ThinkPHP8 项目进行调试。
public function index()
{
$userList = User::select(); // 在这一行设置断点
return json($userList);
}
除了断点调试,ThinkPHP8 还提供了完善的日志与错误处理机制,帮助我们在开发和生产环境中更好地管理和排查问题。
'log' => [
'type' => 'file',
'path' => runtime_path(). 'log/',
'level' => ['error', 'warning'],
'single' => false,
'file_size' => 2097152,
'time_format' => 'Y-m-d H:i:s',
'close' => false,
'json' => false,
],
上述配置中,type表示日志记录方式,这里设置为file表示记录到文件中;path指定日志保存目录;level设置记录的日志级别;single表示是否将所有日志记录到同一个文件中;file_size表示每个日志文件的大小;time_format设置日志中时间的格式。
'log' => [
'level' => ['debug'],
// 其他配置项
],
这样,在开发过程中,所有级别的日志信息都会被记录下来,包括调试信息、SQL 语句执行情况等,有助于我们全面了解程序的运行状态。
'app_debug' => true,
'app_debug' => false,
此外,还可以自定义错误处理函数,实现更灵活的错误处理逻辑。在app\common\exception\Handle.php文件中,可以重写render方法来处理异常并返回自定义的错误响应。例如,当发生数据库连接错误时,返回一个友好的错误提示给用户:
namespace app\common\exception;
use think\exception\Handle;
use think\Response;
class Handle extends Handle
{
public function render($request, \Exception $e)
{
if ($e instanceof \think\exception\DbException) {
return Response::create('数据库连接出现问题,请稍后再试', 'json', 500);
}
return parent::render($request, $e);
}
}
通过合理配置日志和处理错误信息,我们可以更好地监控和管理 ThinkPHP8 项目的运行状态,提高项目的稳定性和可靠性。
在将 ThinkPHP8 项目部署上线之前,我们需要对项目进行打包与优化,以减少文件大小、提高加载速度和降低服务器负载。
http {
gzip on;
gzip_types text/plain text/css application/javascript application/json application/xml;
gzip_min_length 1000;
gzip_comp_level 6;
}
上述配置中,gzip on开启gzip压缩功能;gzip_types指定需要压缩的文件类型;gzip_min_length设置最小压缩文件长度,小于该长度的文件不进行压缩;gzip_comp_level设置压缩级别,取值范围为 1 - 9,级别越高压缩率越高,但压缩时间也越长,一般设置为 6 左右即可。对于 Apache 服务器,可以在.htaccess文件中添加以下内容开启gzip压缩:
<IfModule mod_deflate.c>
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/json
AddOutputFilterByType DEFLATE application/xml
</IfModule>
这样,当客户端请求文件时,服务器会自动将文件压缩后发送给客户端,减少数据传输量,提高页面加载速度。
npm install webpack webpack - cli --save - dev
npm install mini - css - extract - plugin --save - dev
然后在项目根目录下创建webpack.config.js文件,配置如下:
const path = require('path');
const MiniCssExtractPlugin = require('mini - css - extract - plugin');
module.exports = {
entry: {
main: './src/js/main.js' // 入口文件,可以根据实际情况修改
},
output: {
path: path.resolve(__dirname, 'dist/js'),
filename: '[name].bundle.js'
},
module: {
rules: [
{
test: /\.css$/,
use: [MiniCssExtractPlugin.loader, 'css - loader']
}
]
},
plugins: [
new MiniCssExtractPlugin({
filename: '../css/[name].bundle.css'
})
]
};
上述配置中,entry指定入口文件,output指定输出文件的路径和文件名,module.rules配置如何处理 CSS 文件,plugins中使用MiniCssExtractPlugin将 CSS 文件提取出来并单独打包。在命令行中执行npx webpack --config webpack.config.js命令,即可将指定的 JavaScript 和 CSS 文件合并并打包到指定目录。这样,在页面中只需要引入合并后的 CSS 和 JavaScript 文件,减少了请求数量,提高了加载效率。
<img src="small.jpg"
srcset="small.jpg 480w, medium.jpg 768w, large.jpg 1200w"
sizes="(max-width: 480px) 480px, (max-width: 768px) 768px, 1200px"
alt="示例图片">
上述代码中,srcset属性指定了不同尺寸图片的路径和对应的像素密度描述,sizes属性根据屏幕宽度指定了不同情况下应加载的图片尺寸,浏览器会根据设备屏幕分辨率和可用带宽自动选择最合适的图片进行加载,避免加载过大尺寸的图片浪费流量和时间。
完成项目的打包与优化后,就可以将项目部署到服务器上,使其能够对外提供服务。部署过程涉及上传文件、配置服务器环境以及设置访问权限等步骤。
yum install httpd php php - mysqlnd
上述命令会安装Apache服务器、PHP以及PHP的 MySQL 扩展。安装完成后,需要配置Apache的虚拟主机,使其能够正确访问项目。在/etc/httpd/conf.d/目录下创建一个新的虚拟主机配置文件,例如tp8_project.conf,内容如下:
<VirtualHost *:80>
ServerName your_domain.com
DocumentRoot /var/www/html/tp8_project/public
<Directory /var/www/html/tp8_project/public>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
将your_domain.com替换为你的域名,/var/www/html/tp8_project/public替换为项目的public目录路径。保存配置文件后,重启Apache服务使配置生效:
systemctl restart httpd
如果使用的是 Nginx 服务器,安装命令根据不同的 Linux 发行版有所不同,例如在 Ubuntu 中:
apt - get install nginx php - fpm php - mysql
安装完成后,在/etc/nginx/sites - available/目录下创建虚拟主机配置文件,例如tp8_project,内容如下:
server {
listen 80;
server_name your_domain.com;
root /var/www/html/tp8_project/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php - 7.4 - fpm.sock; // 根据实际PHP版本修改
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
同样,将your_domain.com和项目路径替换为实际值。然后创建软链接使配置生效:
ln - s /etc/nginx/sites - available/tp8_project /etc/nginx/sites - enabled/
systemctl restart nginx
对于 Windows 系统,使用 IIS 服务器时,需要在 IIS 管理器中添加网站,设置网站的物理路径为项目的public目录,并配置 PHP 的 FastCGI 设置,确保 IIS 能够正确解析 PHP 文件。
chown -R www - data:www - data /var/www/html/tp8_project
上述命令将/var/www/html/tp8_project目录及其所有子文件和子目录的所有者和所属组设置为www - data。然后设置目录和文件的权限,对于目录,一般设置为 755,对于文件,一般设置为 644,执行以下命令:
find /var/www/html/tp8_project -type d -exec chmod 755 {} \;
find /var/www/html/tp8_project -type f -exec chmod 644 {} \;
上述命令使用find命令查找指定目录下的所有目录和文件,并分别设置相应的权限。这样可以确保 Web 服务器用户有足够的权限访问项目文件,同时也保证了文件的安全性,防止未经授权的访问和修改。在 Windows 系统中,通过文件属性设置来调整文件和目录的访问权限,确保 IIS 用户对项目文件有读取和执行权限。
项目上线后,并不意味着工作的结束,还需要进行定期的维护与监控,以确保项目的稳定运行和用户的良好体验。
top - 10:25:37 up 1 day, 2:15, 1 user, load average: 0.23, 0.18, 0.16
Tasks: 201 total, 1 running, 200 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.2 sy, 0.0 ni, 99.5 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 16384252 total, 14432216 free, 1062632 used, 889404 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 15181480 avail Mem
通过这些信息,可以了解服务器当前的负载情况、CPU 和内存的使用比例等,及时发现潜在的性能问题。如果发现 CPU 使用率过高,可能是某个进程占用资源过多,需要进一步排查并优化;如果磁盘空间不足,需要清理不必要的文件或增加磁盘容量。
mysqldump -u your_username -p your_database > backup.sql
将your_username替换为数据库用户名,your_database替换为数据库名,执行命令后会提示输入密码,输入正确密码后,会将数据库数据导出到backup.sql文件中。为了实现定期自动备份,可以使用crontab定时任务。编辑crontab文件:
crontab -e
在文件中添加如下内容,实现每天凌晨 2 点备份数据库:
0 2 * * * mysqldump -u your_username -p your_database > /backup/mysql/backup_$(date +\%Y\%m\%d).sql
上述命令会在每天凌晨 2 点将数据库备份到/backup/mysql/目录下,备份文件名包含当天的日期。对于项目文件备份,可以使用rsync等工具将文件同步到备份服务器或存储设备上。例如,将/var/www/html/tp8_project目录同步到另一台服务器的/backup/tp8_project目录:
rsync -avz /var/www/html/tp8_project/ user@backup_server:/backup/tp8_project
将user替换为备份服务器的用户名,backup_server替换为备份服务器的地址。这样可以定期将项目文件备份到指定位置,当出现数据丢失或损坏时,可以快速恢复数据。