PHP&thinkphp学习笔记

PHP&thinkphp学习笔记

已经拿到外包的项目源码了,之前就有说后台是用php写的,所以学了点基础,看了下源码,好嘛,打开了新世界,外包用的是thinkphp的框架,在网上看了点文档,然后摸索了一下他们的逻辑,大致也懂了,这里主要是写点部署上的事情

部署

php部署有两种方式
一种就是面向新手的,在百度上下一个宝塔还是小皮啥的一键服务的软件,他们里面已经自带了mysql,nginx,apache,所以你只需要配置一下端口号和项目目录就基本部署完成了;
这种方式有好有坏,对新手入门很好,不用考虑太多,但是对企业啥的来说会比较麻烦,比如说他自带的mysql和nginx就会和企业服务器已有的mysql,nginx重复,并且造成不必要的资源和端口号浪费就已经很麻烦了

另一种是自己简单的搭一下,可以充分利用公司已有的东西,就是需要配置的东西多一点,看着大佬们的文档配一下就行了
我用的是这个帖子的,里面顺便把php怎么安装使用也说了,我是跟着陪然后就能访问了

https://blog.csdn.net/sinat_41883985/article/details/106061125

遇到的问题

一开始用的是傻瓜式的部署程序,那个得关闭我自己已经有的数据库,用他的才行,然后遇到了关闭它自带的数据库之后,自己的数据库打不开的问题,提示是服务名无效
解决方法:在数据库的bin目录下,输入

mysqld -install

等待提示service install successfully的文字
然后重新启动数据库即可,当然配置了环境变量就随便找个目录输入下面的启动命令行也行

net start mysql

php版本和mysql版本之间的问题
php7以下的版本连接mysql8的时候会不允许访问,需要配置一下
在mysql根目录里找到my.ini,添加


character-set-server = utf8
default-authentication-plugin=mysql_native_password

然后重启mysql
如果还是不能访问并且提示
SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client
相关的内容
则还需要通过cmd命令行进入mysql
修改一下访问mysql的用户的权限

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '';

有的是直接显示成功,像这样
在这里插入图片描述
有的则可能会出现
在这里插入图片描述
这个问题
解决方法就是把localhost改成%然后运行即可,甚至不用重启mysql
我是在win7系统上的msyql8遇到的这个问题,win10没有这个情况,也没有上面的问题
程序真的是匪夷所思捏

php在win10 64位下执行curl_init()方法报错的bug

解决方案:

https://blog.csdn.net/weixin_28764585/article/details/115960108?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_baidulandingword~default-0-115960108-blog-115960098.pc_relevant_3mothn_strategy_and_data_recovery&spm=1001.2101.3001.4242.1&utm_relevant_index=3

核心问题:项目所在的服务器软件中少了允许php调用外部命令的dll文件
将需要的三个dll文件放在服务器软件中(我的是apache)的bin目录下,然后
httpd -k restart
即可正常调用和运行

thinkphp登陆失效的问题

情景:因为时间关系我是直接把本地的php和php项目直接复制拖入到服务器上的,通过apache启动后能正常访问就没有怎么理了
现在php项目里有一个后台的管理界面,通过账号密码登陆后提示登录失败,又返回到了登陆的界面,但是后台数据库和密码那些都是正确的,于是在网上查看了一下,发现是在登陆后的session没有保存成功,导致他是空的,这样在重定向对session进行判断时就会以为没有登陆成功,就会导致登陆成功后还是一直跳回登陆的界面,那么具体是什么问题导致的呢,一开始我以为是php里session设置的问题,然后在本地和服务器上的项目里都通过php_info对比了一下,发现两者没有区别,然后后面把关注点转移到了session的保存路径上,于是就发现因为是直接复制到服务器上的,而本地的session保存的路径在服务器上是没有的,因此系统无法正确的保存session,也就无法获得session
解决办法,在php项目中找到php.ini这个配置文件,
找到session.savepath的字样,然后修改到不为空的文件夹的路径,最后重启一下php项目所在的环境即可(比如我是放在apache的,因此通过命令行 httpd -k restart)即可重启,然后这个问题就解决了~

不同的win系统上无法使用curl的问题

https://curl.se/windows/

此链接上下载对应位数的curl压缩包,然后解压在服务器/你的win电脑上,然后在环境变量里添加解压后的文件的bin路径,就可以了

2023.3.22
tp5框架下无法通过curl访问外部api
可以在请求头上添加

"User-Agent:Mozilla/4.76"

thinkphp下调用python脚本

描述:希望在php中调用python脚本返回数据,发现请求之后没有任何反应

先要有反应

在php.ini中开启display_errors
可以直接在php中调用

ini_set("displays_error",0n);

然后打印一下php.info
ctrl+f
搜索display_errors,看看是不是显示on
然后在你要调用的php中的excu/system函数中输入的参数最后添加 ‘2>&1’

$result = excu("python main.py 2>&1");

然后就会出现报错信息了

提示python不是内部命令

浏览器调用php接口进行请求的时候提示python不是内部命令或者 批处理等文字时,说明当你在php中调用python脚本的时候,不能单纯的只是输入python,即使你的电脑已经配置了python的环境变量也不行,你必须要指定python在你电脑中的绝对路径,然后再输入对应需要执行的py文件

$result = excu("D:/sorftwares/Python/python main.py")

以上处理后还提示no file /directory

如果你是普通的php项目,非框架/非自行处理了映射路径的框架的话,是没有这一步的问题的
我的项目用的是tp框架,它对路径进行了处理,所以即使你把main.py文件放在了php文件的同级目录也是无法访问到的,也因此才会出现这个找不到对应的main.py的异常
解决:
如何解决呢,一样的输入正确的路径即可

$path = getcwd();//这个是获取到当前文件路径的函数,在后面拼接你的main.py和这个文件对应的路径即可

比如我是放在了执行php文件的上一级名叫python的文件夹里的main.py中
那么路径就是

$path = getcwd().'\Python\amin.py'

整体上你的代码应该是

$path = getcwd().'main.py在getcwd()中显示的路径下对应的路径'  // 我的是getcwd().'\Application\Api\Python\main.py'
$result = excu("D:/sorftwares/Python/python ".$path);

关于json里为数组时出现的问题

如题,如果前端发送给php后台的json是数组的话,php无法通过平时使用的json_decode函数进行转换,结果会为null

解决方法

使用函数

html_entity_decode($str)

然后再调用json_decode函数即可成功转换为php可识别的数组内容

thinkphp实现websocket

描述 需要在thinkphp中调用智能大模型的流式接口,需要通过websocket进行实现

准备工作

  1. thinkphp环境中添加text/websocket组件
    可以使用composer指令,在thinkphp的vendor文件夹下,进入cmd指令,然后输入下面代码
composer require text/websocket

如果提示版本问题的话,可以在上面的代码后面再加上:* 意味着他会自动下载适配的版本
建议使用composer指令进行下载,因为thinkphp可能存在我不理解的机制,composer最为保守(亲测成功)

  1. 在要调用websocket的server或者client类的时候需要在对应的脚本上方,提供websocket这个库对应在项目中的路径,否则即使在编译器中不报错,在实际的调用中也还是会提示你找不到websocket这个库,原因也很简单,每个项目的thinkphp路由的方式都各有千秋,因此如果你不设置,可能刚好是和默认的路径保持了一致,所以能够正常调用。建议是在要调用的类的最上面和use指令一样,指定一下库的路径比较保险。代码如下
require(dirname(dirname(dirname(dirname(__FILE__)))) . '/vendor/autoload.php');

这个dirname就是上一级路径,比如我这里有四个,就是返回到上四个路径,实际根据你的项目的路由和websocket库在项目中的路径而定
然后就是和其他教学的流程一样,进行调用和处理即可

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

淳杰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值