129.宝塔形数据的处理-案例

博客围绕宝塔形数据的处理展开,重点涉及SQL语句相关内容,通过具体案例展示如何运用SQL对宝塔形数据进行处理,为信息技术领域中数据处理相关工作提供参考。
/*--

第一层   -                    1 
第二层   -           2                3
第三层   -      4        5        6        7
第四层   -    8   9   10   11   12   13   14  15 

将顺序的数据(1~N)依如下规则排列
1,排成塔形.
2,下一层所排数字是对上一层的两倍.(第一层为1个,第二层为2个,第三层4个,如此类推)
3,自上到下,自左到右紧密排列.

现在要找出每个号码下面号码的个数.

--邹建 2004.4--*/

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_id]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_id_num]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_id_num]
GO

--得到每个号码下面包含的号码
create function f_id(
@num int,		--那个数下面的子
@max_num int	--统计结束的数字
)returns @re table(id int identity(1,1),num int,level int)
as 
begin
	declare @level int,@left int,@i int,@j int

	if @num>@max_num goto lb_re

	select @level=0,@i=@num
	while @i>1
		select @level=@level+1,@i=@i/2

	insert @re values(@num,@level+1)
	select @left=(@num%power(2,@level))*2
		,@level=@level+1
		,@num=power(2,@level)
		,@i=0,@j=2
	while 1=1
	begin
		while @i<@j
		begin
			if (@left+@num+@i)>@max_num goto lb_re
			insert @re values(@left+@num+@i,@level+1)
			set @i=@i+1
		end
		select @level=@level+1
			,@left=@left*2
			,@num=@num*2
			,@i=0,@j=@j*2
	end

lb_re:
	return
end
go

--得到每个号码下面包含的号码个数
create function f_id_num(
@num int,		--那个数下面的子
@max_num int	--统计结束的数字
)returns int
as 
begin
	declare @level int,@left int,@re int,@i int,@j int
	
	set @re=0
	if @num>@max_num goto lb_re

	select @level=0,@i=@num
	while @i>1
		select @level=@level+1,@i=@i/2

	select @left=(@num%power(2,@level))*2
		,@level=@level+1
		,@num=power(2,@level)
		,@i=0,@j=2
	while 1=1
	begin
		while @i<@j
		begin
			if (@left+@num+@i)>@max_num goto lb_re
			select @re=@re+1,@i=@i+1
		end
		select @level=@level+1
			,@left=@left*2
			,@num=@num*2
			,@i=0,@j=@j*2
	end

lb_re:
	return(@re)
end
go

--调用实现查询
select * from f_id(2,8)

select dbo.f_id_num(2,8)
go

/*--测试结果
id          num         level       
----------- ----------- ----------- 
1           3           2
2           6           3
3           7           3
4           12          4
5           13          4
6           14          4
7           15          4

(所影响的行数为 7 行)
--*/
🎉 **关键诊断结果出来了!** 你执行了: ```bash ls -l /www/server/php/56/lib/php/extensions/no-debug-non-zts-20131226/ ``` 输出如下: ``` total 31652 -rwxr-xr-x 1 root root 1025840 Aug 2 2023 event.so -rwxr-xr-x 1 root root 218496 Aug 2 2023 exif.so -rwxr-xr-x 1 root root 3566600 Aug 3 2023 fileinfo.so -rwxr-xr-x 1 root root 1563920 Aug 2 2023 imagick.so ... ``` --- ## 🔴 结论:**PHP 扩展文件缺失严重!** ### ❌ 缺失的关键 `.so` 文件包括: | 扩展名 | 是否存在 | |--------------|----------| | `json.so` | ❌ 不存在 | | `sockets.so` | ❌ 不存在 | | `pdo_mysql.so`| ❌ 不存在 | | `mysqli.so` | ❌ 不存在 | > ⚠️ 虽然你在宝塔面板看到这些扩展“已安装”,但实际文件根本没有生成! 这就是为什么运行 `php` 时会报错: ```bash PHP Warning: PHP Startup: Unable to load dynamic library '.../json.so' ... No such file or directory ``` 因为——**文件真的不存在!** --- ## 🛠️ 根本原因分析 这是典型的 **宝塔“假安装”问题**,常见于以下情况: 1. ✅ 在宝塔点击“安装”扩展 2. ❌ 服务器内存不足(<1GB)→ 编译过程崩溃 3. ⚠️ 宝塔前端仍显示“安装成功” 4. 💥 实际 `.so` 文件未生成 → PHP 启动失败 📌 特别注意:`json` 和 `sockets` 是 PHP 的**核心扩展**,必须手动编译进 PHP 或作为动态模块存在。而你的系统中它们都丢了! --- # ✅ 解决方案:强制重新安装缺失的扩展 我们通过 **宝塔后台卸载 + 重装** 来触发真正的编译。 --- ## ✅ 步骤一:登录宝塔面板并进入 PHP 5.6 设置 1. 打开浏览器访问:`http://你的服务器IP:8888` 2. 登录后 → 左侧「软件商店」 3. 找到「PHP 5.6」→ 点击右侧「设置」(齿轮图标) --- ## ✅ 步骤二:对每个缺失的扩展执行「卸载 → 安装」 ### 操作顺序如下: | 扩展名 | 动作 | 备注 | |--------------|--------------------------|------| | `sockets` | 先「卸载」→ 再「安装」 | ❗最关键,WebSocket 依赖 | | `json` | 先「卸载」→ 再「安装」 | 基础功能,否则 `json_encode` 报错 | | `pdo_mysql` 或 `mysqli` | 卸载 → 安装 | 数据库连接用(可选) | 👉 点击后等待几分钟,让宝塔自动下载源码、编译、生成 `.so` 文件。 --- ## ✅ 步骤三:验证文件是否生成(终端操作) 重新运行: ```bash ls -l /www/server/php/56/lib/php/extensions/no-debug-non-zts-20131226/{json,sockets,pdo_mysql,mysqli}.so ``` ✅ 成功时你应该看到似: ``` -rwxr-xr-x 1 root root 123456 json.so -rwxr-xr-x 1 root root 234567 sockets.so -rwxr-xr-x 1 root root 345678 pdo_mysql.so ``` 如果没有出现,请继续看下面的备选方案。 --- ## ✅ 备选方案:检查 PHP 配置是否启用这些扩展 查看 `php.ini` 中是否有无效的 `extension=` 指向不存在的文件。 ```bash grep -E "extension.*so" /www/server/php/56/etc/php.ini ``` 你会看到似: ```ini extension=json.so extension=sockets.so extension=pdo_mysql.so ``` 但如果这些文件不存在,PHP 就会报错。 ### ✔️ 临时解决办法:注释掉不存在的 extension 行 编辑配置: ```bash vim /www/server/php/56/etc/php.ini ``` 找到这些行,加上分号注释掉: ```ini ;extension=json.so ;extension=sockets.so ;extension=pdo_mysql.so ``` 然后测试能否静默启动: ```bash php -v ``` 如果不再报错,说明“警告消失”,但这只是掩盖问题,不是解决! 🎯 目标是:**让 `.so` 文件真实存在,并取消注释,正常加载!** --- ## ✅ 最终目标验证脚本 创建一个测试文件: ```bash vim check.php ``` 内容: ```php <?php echo "✅ JSON 扩展: ", extension_loaded('json') ? 'YES' : 'NO', "\n"; echo "✅ SOCKETS 扩展: ", extension_loaded('sockets') ? 'YES' : 'NO', "\n"; echo "✅ PDO_MYSQL 扩展: ", extension_loaded('pdo_mysql') ? 'YES' : 'NO', "\n"; echo "✅ PHP 版本: " . PHP_VERSION . "\n"; ``` 运行: ```bash php check.php ``` ✅ 正确输出应为: ``` ✅ JSON 扩展: YES ✅ SOCKETS 扩展: YES ✅ PDO_MYSQL 扩展: YES ✅ PHP 版本: 5.6.40 ``` 只有到这一步,你才能运行 Ratchet WebSocket! --- ## ✅ 后续步骤提醒 1. ✅ 成功安装 `.so` 文件后,再运行: ```bash composer self-update --2.2 rm -rf vendor composer.lock composer require cboden/ratchet:0.4.3 --ignore-platform-reqs ``` 2. ✅ 启动服务: ```bash php ChatServer.php ``` 3. ✅ 使用 `nohup` 后台运行: ```bash nohup php ChatServer.php > ws.log 2>&1 & ``` --- ## 🧰 进阶建议(长期解决方案) | 问题 | 建议 | |------|------| | PHP 5.6 已停止维护 | 尽快升级到 PHP 7.4+ | | 内存不足导致编译失败 | 升级服务器配置至 2GB RAM | | 宝塔 UI 显示不准 | 查看 `/www/wwwlogs/php_extension_install.log` 日志排查 | | Composer 不兼容 | 固定使用 `composer self-update --2.2` | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值