没有不值得去解决的问题,也没有不值得去学习的技术!

执行生成的 SQL ,在本地 Windows 10 中可以,在 Liunx 容器中,未查询到记录(与 DIRECTORY_SEPARATOR 有关)

决定打印生成的 SQL,需要删除 ->first() 。进行一下对比。Windows 10 与 Linux 的分别如下,然后在 MySQL 中执行 Linux 下的 SQL ,查询结果为 NULL。区别在于 pages/\ 与 pages//

1、执行生成的 SQL ,在本地 Windows 10 中可以,在 Liunx 容器中,未查询到记录。在 Windows 10 下打印记录。如图1

执行生成的 SQL ,在本地 Windows 10 中可以,在 Liunx 容器中,未查询到记录。在  Windows 10 下打印记录
图1
PHP

$rawSchema = ThemeAssetEntity::select('schema')
	->where('theme_id', '=', $this->getThemeId())
	->where('category', '=', ThemeAssetEntity::CATEGORY_PAGE)
	->where('asset_key', 'regexp', $this->themeLayout->getTemplateExtensionsPattern($basename))
	->first();
var_dump($rawSchema);
exit;

2、在 Liunx 容器 下打印记录。其结果为 NULL。如图2

在 Liunx 容器 下打印记录。其结果为 NULL
图2

3、决定打印生成的 SQL,需要删除 ->first() 。进行一下对比。Windows 10 与 Linux 的分别如下,然后在 MySQL 中执行 Linux 下的 SQL ,查询结果为 NULL。区别在于 pages/\ 与 pages//。如图3

决定打印生成的 SQL,需要删除 ->first() 。进行一下对比。Windows 10 与 Linux 的分别如下,然后在 MySQL 中执行 Linux 下的 SQL ,查询结果为 NULL。区别在于 pages/\ 与 pages//
图3
PHP

$rawSchema = ThemeAssetEntity::select('schema')
	->where('theme_id', '=', $this->getThemeId())
	->where('category', '=', ThemeAssetEntity::CATEGORY_PAGE)
	->where('asset_key', 'regexp', $this->themeLayout->getTemplateExtensionsPattern($basename));
$query = str_replace(array('?'), array('\'%s\''), $rawSchema->toSql());
$query = vsprintf($query, $rawSchema->getBindings());
dump($query);
exit;

SQL

select `schema` from `theme_asset` where `theme_id` = '96b1c8b9-5b18-4760-9e26-50ab009ac011' and `category` = 'page' and `asset_key` regexp '^pages/\product_detail(\.blade\.php|\.liquid|\.json)'

SQL

select `schema` from `theme_asset` where `theme_id` = '96dcab33-3e1d-4279-ab96-39693f03515f' and `category` = 'page' and `asset_key` regexp '^pages//product_detail(\.blade\.php|\.liquid|\.json)'

4、分析生成正则表达式的函数。打印 DIRECTORY_SEPARATOR,两个环境的结果是不一致的。分别为 \ 与 /

PHP

    public function getTemplateExtensionsPattern($basename)
    {
        $escapeDot = array_map(function($extension){
            return str_replace('.', '\\.' ,$extension);
        }, $this->getTemplateExtensions());
        print_r(DIRECTORY_SEPARATOR);
        exit;
       return sprintf('^%s%s%s%s', $this->getPageDir(), '/'.DIRECTORY_SEPARATOR, $basename, '('.join('|', $escapeDot) .')');
    }

Plaintext

\

Plaintext

/

5、删除掉 .DIRECTORY_SEPARATOR,因为其在两个操作系统中不一致。且因为在表中仅使用 /,无需要再转义。最终生成的 SQL 在两个操作系统中一致。且能够查询到结果。如图4

删除掉 .DIRECTORY_SEPARATOR,因为其在两个操作系统中不一致。且因为在表中仅使用 /,无需要再转义。最终生成的 SQL 在两个操作系统中一致。且能够查询到结果
图4
PHP

public function getTemplateExtensionsPattern($basename)
{
	$escapeDot = array_map(function($extension){
		return str_replace('.', '\\.' ,$extension);
	}, $this->getTemplateExtensions());

   return sprintf('^%s%s%s%s', $this->getPageDir(), '/', $basename, '('.join('|', $escapeDot) .')');
}

SQL

select `schema` from `theme_asset` where `theme_id` = '96dcab33-3e1d-4279-ab96-39693f03515f' and `category` = 'page' and `asset_key` regexp '^pages/product_detail(\.blade\.php|\.liquid|\.json)'

Linux 服务器运维、部署与线上故障排查

如果你的网站或后端服务部署在 Linux 服务器上,遇到访问异常、Nginx 配置问题、MySQL / Redis 异常、Docker 服务不可用、磁盘占满、CPU / 内存过高等问题,可以联系我做一次远程排查。

适合以下场景:
✅ 网站打不开或访问不稳定
✅ Nginx / PHP-FPM 配置异常
✅ MySQL / Redis 性能或连接问题
✅ Docker 服务部署与维护
✅ 服务器迁移与环境配置
✅ CPU / 内存 / 磁盘异常排查

服务内容:
✅ Linux 环境检查
✅ 网站部署与迁移
✅ Nginx / PHP-FPM / MySQL / Redis 排查
✅ Docker 配置与维护
✅ 服务器性能分析
✅ 长期远程运维支持

如需咨询,请联系我,并注明:Linux 运维咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com