学习笔记

PHP&thinkphp学习笔记

  • 部署
  • 遇到的问题
  • php在win10 64位下执行curl_init()方法报错的bug
  • thinkphp登陆失效的问题
  • 不同的win系统上无法使用curl的问题
  • thinkphp下调用python脚本
  • 先要有反应
  • 提示python不是内部命令
  • 以上处理后还提示no file /directory
  • 关于json里为数组时出现的问题
  • 解决方法
  • thinkphp实现websocket
  • 准备工作

PHP&thinkphp学习笔记

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

部署

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

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

遇到的问题

一开始用的是傻瓜式的部署程序,那个得关闭我自己已经有的数据库,用他的才行,然后遇到了关闭它自带的数据库之后,自己的数据库打不开的问题,提示是服务名无效 解决方法:在数据库的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 '';

有的是直接显示成功,像这样

docker 宝塔 重启服务_docker 宝塔 重启服务

有的则可能会出现

docker 宝塔 重启服务_mysql_02

这个问题

解决方法就是把localhost改成%然后运行即可,甚至不用重启mysql

我是在win7系统上的msyql8遇到的这个问题,win10没有这个情况,也没有上面的问题

程序真的是匪夷所思捏

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

解决方案:

核心问题:项目所在的服务器软件中少了允许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库在项目中的路径而定 然后就是和其他教学的流程一样,进行调用和处理即可