草庐IT

从改一个老项目开始的PHP踩坑记

会飞的一棵树 2023-03-28 原文

php所有版本的地址: https://windows.php.net/downloads/releases/archives/

访问控制器时省略了index.php报No input file specified.

解决:public/.htaccess下文件改为(RewriteRule行):

<IfModule mod_rewrite.c>
  Options +FollowSymlinks -Multiviews
  RewriteEngine On

  RewriteCond %{REQUEST_FILENAME} !-d
  RewriteCond %{REQUEST_FILENAME} !-f
  RewriteRule ^(.*)$ index.php?s=$1 [QSA,PT,L]
</IfModule>

Apache开启路由重写(一般默认开启了):
httpd.conf中mod_rewrite.so注释去掉。

阿里文件上传跨域

错误信息:

Access to XMLHttpRequest at 'http://xxxx.oss-cn-hangzhou.aliyuncs.com/file?uploads=' from origin 'http://localhost' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.

require_once(): Failed opening required '../a.php' (include_path='.;C:\php\pear')

通过百度尝试以下,都没用:
1.可能由于你没有传完整php程序,或者php程序中的某个文件损坏,可能会报这个错误。去官网重新下载文件,是虚拟空间的请用官网支持的FTP工具上传php程序。
2.文件权限问题,可能文件或者文件夹权限设置错误引起的。
3.文件夹名含有中文,有时候中文文件夹名也可能引起这个错误,建议改成英文的。
4.修改php程序,这个方法我不推荐(因为有的php程序可能需要改很多很多)
5.修改php.ini配置文件。

通过测试,其在相同路径或者子路径是能生效的,也就是说它不识别../跳到上一个路径,那就直接使用路径常量定位到项目根路径,进行拼接,如:

require_once THINK_PATH.'\Library\Vendor\aliyunOss\autoload.php';

Can't use method return value in write context

错误位置
FILE: xxx\WWW\app\ThinkPHP\Library\Vendor\aliyunOss\src\OSS\OssClient.php  LINE: 3384

这里是使用了阿里云OSS的phpsdk,目前的版本是(2.6.0 时间是:20221022),其文档上说支持PHP 5.3以上版本。

但很可惜那都是骗人的,然后换底版本的sdk(v2.2.4)。这个错就消失了。

Exception' with message '"xxxx.oss-cn-beijing.aliyuncs.com"bucket name is invalid' in

这是阿里云OSS的一个报错,这说明连上了呀。
这个是bucket名称错了,其值应该是这里的,(而不是像这种的xxx.oss-cn-beijing.aliyuncs.com):

关于文件上传

在php.ini中需要配置文件上传的最大值等,否则上传文件超出大小时$_FILES为空

;post的最大值 默认的post_max_size 为2M
post_max_size=1024M
;PHP页面运行的最大时间值,默认30秒
max_execution_time=300
;上传的最大值 默认为8M post_max_size 大于 upload_max_filesize 为佳
upload_max_filesize=1024M
;是否允许通过HTTP上传文件的开关。默认为ON即是开
file_uploads = on
;文件上传至服务器上存储临时文件的地方,如果没指定就会用系统默认的临时文件夹
upload_tmp_dir
;每个PHP页面接收数据所需的最大时间,默认60秒
max_input_time = 600
;每个PHP页面所吃掉的最大内存,默认8M
memory_limit = 8m

注:部署在Linux中的时候,要上传到的文件夹必须要有相关的权限。不然你在windows环境,啥都正常也传不上的。

ThinkPHP 验证码不显示

  1. 检查PHP是否已经安装GD库支持;将extension=php_gd2.dll的注释放开。
  2. 如果是中文验证码检查是否有拷贝字体文件到类库所在目录;

ThinkPHP 验证码总是不正确 后台不能登入

使用new \Think\Verify();生成验证码会在session中保存验证码的值,但是若session的路径设置有问题,或者是没设置会导致其无法保存,进而一直都是空的导致出错。

;配置session路径
session.save_path="D:\phpStudy\tmp\tmp"

当你配置了它发现还是不行的话,然后你切个低版本的它又行了,可能是当前项目目录下有类型user.ini也配置了session.save_path的值。你可以使用phpinfo();看下是不是有个local的量。

Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'

改错误一般为pdo_mysql拓展未开启,在php.ini中将extension=pdo_mysql的注释放开即可。
还不行,则可在phpinfo中检测拓展的目录是否设置正确,和改目录下是否有该拓展。

STORAGE_WRITE_ERROR:./../cache/Cache/Home/e1abadd62c4e87a9a75c0e547ca055ed.php

cache文件夹没有写入的权限,导致缓存无法写入。此问题很容易在使用widnows开发,然后部署到linux中时,有不少问题就是权限没给导致的。

解决:权限设置成777或者nginx(apache)所在的组和用户。

Fatal error: Uncaught Error: Call to undefined function Think\C() in Library\Think\Think....

可以在app\ThinkPHP\Library\Think\Think.class.php直接看TP的源码:
start方法中有:

点击查看代码
/**
     * 应用程序初始化
     * @access public
     * @return void
     */
    static public function start() {
      ......

      // 这里可以看到 它取了~runtime.php文件
      $runtimefile  = RUNTIME_PATH.APP_MODE.'~runtime.php';
      if(!APP_DEBUG && Storage::has($runtimefile)){
          Storage::load($runtimefile);
      }else{
          if(Storage::has($runtimefile))
              Storage::unlink($runtimefile);
          $content =  '';
          // 读取应用模式
          $mode   =   include is_file(CONF_PATH.'core.php')?CONF_PATH.'core.php':MODE_PATH.APP_MODE.'.php';
          // 加载核心文件
          foreach ($mode['core'] as $file){
              if(is_file($file)) {
                include $file;
                if(!APP_DEBUG) $content   .= compile($file);
              }
          }

          .....

          if(!APP_DEBUG){
              $content  .=  "\nnamespace { Think\\Think::addMap(".var_export(self::$_map,true).");";
              $content  .=  "\nL(".var_export(L(),true).");\nC(".var_export(C(),true).');Think\Hook::import('.var_export(Hook::get(),true).');}';
              Storage::put($runtimefile,strip_whitespace('<?php '.$content));
          }else{
            // 调试模式加载系统默认的配置文件
            C(include THINK_PATH.'Conf/debug.php');
            // 读取应用调试配置文件
            if(is_file(CONF_PATH.'debug'.CONF_EXT))
                C(include CONF_PATH.'debug'.CONF_EXT);           
          }
      }
      ....

      // 运行应用
      App::run();
    }
如果不成立引入正常文件,并 重新生成common~runtime.php编译文件,所以这错的时候就可尝试删除掉~runtime.php文件,让它重新生成,看能不能引入。

若还不能可参考看看:https://blog.csdn.net/matthis_meng/article/details/120286461

关于缓存common~runtime.php

有时发先有些错,咋找都没问题,可能删下这个缓存就好了。

Data truncated for column ‘字段名‘ at row 1

  1. 修改的字段不为空,如已经设定为枚举。
  2. 更新字段长度超出表限制的长度。
  3. 更新的字段类型与表中的类型不匹配。
    具体参考:https://blog.csdn.net/qq_43070236/article/details/126197875

“include_path='.;c:\php5\pear'”错误

在php.ini中可配置include_path来达到在任何文件中都可以直接引入该目录下文件

include_path = '.;c:\php5\pear'

给定有路径/目录(相对路径或绝对路径),则按照给定路径查找文件,include_path设置将被完全忽略。
未给定路径/目录(相对路径或绝对路径),则按照include_path指定目录寻找->脚本所在目录和当前目录下寻找
未找到,include发出一条警告,require发出一个致命错误。
具体可参考:https://www.cnblogs.com/wanghaokun/p/10184491.html

页面错误!请稍后再试~ 相关配置

  1. 未开启调试模式
    没有开启调试的模式的时候相关的配置,可以在app\ThinkPHP\Conf\convention.php进行配置。

  2. 开启调试模式
    public/index.php

// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG', false);

开启调试模式后,更多的配置可以在app\ThinkPHP\Conf\debug.php进行配置。

常用配置项:

'TMPL_CACHE_ON'         =>  true,        // 是否开启模板编译缓存,设为false则每次都会重新编译
'TMPL_CACHE_TIME'       =>  0,         // 模板缓存有效期 0 为永久,(以数字为值,单位:秒)
'SHOW_ERROR_MSG'        =>  false,    // 显示错误信息

有关从改一个老项目开始的PHP踩坑记的更多相关文章

  1. ruby - 如何在 buildr 项目中使用 Ruby 代码? - 2

    如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby​​

  2. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  3. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  4. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  5. ruby-on-rails - 项目升级后 Pow 不会更改 ruby​​ 版本 - 2

    我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby​​版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby​​版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘

  6. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  7. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - Rails - 从另一个模型中创建一个模型的实例 - 2

    我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案

  10. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

随机推荐